php पहल एक हफ्ते के सप्ताह दिए गए सप्ताह के दिनों की गणना करना




हिंदी में दिनों का नाम (11)

यह गणना इस बात पर निर्भर करती है कि आप कहां रहते हैं। उदाहरण के लिए, यूरोप में हम सोमवार के साथ सप्ताह शुरू करते हैं, अमेरिकी रविवार में सप्ताह का पहला दिन होता है। यूके सप्ताह 1 में 1 जनवरी को है, अन्य देश सप्ताह के पहले गुरुवार को सप्ताह में शुरू होते हैं।

आप http://en.wikipedia.org/wiki/Week#Week_number पर अधिक सामान्य जानकारी पा सकते हैं

एक सप्ताह की संख्या दी गई, उदाहरण के लिए date -u +%W , आप सोमवार से शुरू होने वाले सप्ताह के दिनों की गणना कैसे करते हैं?

सप्ताह 40 के लिए आरएफसी -3339 आउटपुट उदाहरण:

2008-10-06
2008-10-07
2008-10-08
2008-10-09
2008-10-10
2008-10-11
2008-10-12

$year      = 2016; //enter the year
$wk_number = 46;   //enter the weak nr

$start = new DateTime($year.'-01-01 00:00:00');
$end   = new DateTime($year.'-12-31 00:00:00');

$start_date = $start->format('Y-m-d H:i:s');

$output[0]= $start;    
$end   = $end->format('U');    
$x = 1;

//create array full of data objects
for($i=0;;$i++){
    if($i == intval(date('z',$end)) || $i === 365){
        break;
    }
    $a = new DateTime($start_date);
    $b = $a->modify('+1 day');
    $output[$x]= $a;        
    $start_date = $b->format('Y-m-d H:i:s');
    $x++;
}    

//create a object to use
for($i=0;$i<count($output);$i++){
    if(intval ($output[$i]->format('W')) === $wk_number){
        $output_[$output[$i]->format('N')]        = $output[$i];
    }
}

$dayNumberOfWeek = 1; //enter the desired day in 1 = Mon -> 7 = Sun

echo '<pre>';
print_r($output_[$dayNumberOfWeek]->format('Y-m-d'));
echo '</pre>';

php date php से दिनांक () ऑब्जेक्ट के रूप में उपयोग करें


चूंकि इस प्रश्न और स्वीकृत उत्तर को DateTime कक्षाएं पोस्ट करने के लिए बहुत आसान बनाती हैं: -

function daysInWeek($weekNum)
{
    $result = array();
    $datetime = new DateTime('00:00:00');
    $datetime->setISODate((int)$datetime->format('o'), $weekNum, 1);
    $interval = new DateInterval('P1D');
    $week = new DatePeriod($datetime, $interval, 6);

    foreach($week as $day){
        $result[] = $day->format('D d m Y H:i:s');
    }
    return $result;
}

var_dump(daysInWeek(24));

इसमें लीप साल आदि की देखभाल करने का अतिरिक्त लाभ है ..

इसे काम देखें । मुश्किल सप्ताह 1 और 53 सहित।


यदि आपके पास ज़ेंड फ्रेमवर्क है तो आप इसे करने के लिए Zend_Date क्लास का उपयोग कर सकते हैं:

require_once 'Zend/Date.php';

$date = new Zend_Date();
$date->setYear(2008)
     ->setWeek(40)
     ->setWeekDay(1);

$weekDates = array();

for ($day = 1; $day <= 7; $day++) {
    if ($day == 1) {
        // we're already at day 1
    }
    else {
        // get the next day in the week
        $date->addDay(1);
    }

    $weekDates[] = date('Y-m-d', $date->getTimestamp());
}

echo '<pre>';
print_r($weekDates);
echo '</pre>';

एक और समाधान:

//$date Date in week
//$start Week start (out)
//$end Week end (out)

function week_bounds($date, &$start, &$end) {
    $date = strtotime($date);
    $start = $date;
    while( date('w', $start)>1 ) {
        $start -= 86400;
    }
    $end = date('Y-m-d', $start + (6*86400) );
    $start = date('Y-m-d', $start);
}

उदाहरण:

week_bounds("2014/02/10", $start, $end);
echo $start."<br>".$end;

बाहर:

2014-02-10
2014-02-16

मेरे पास वही प्रश्न था जो आज के शुरुआती बिंदु के रूप में था, क्योंकि मेरा शुरुआती बिंदु यानी% डब्ल्यूआई का उपयोग करके स्ट्रेटटाइम से एक हफ्ते का नंबर प्राप्त हुआ था, उस सप्ताह के लिए तिथि सीमा - सोमवार से रविवार (या वास्तव में किसी भी शुरुआती दिन) को जानना चाहता था। कई समान पदों की समीक्षा और विशेष रूप से उपर्युक्त दृष्टिकोणों में से कुछ को आजमाने के लिए मुझे समाधान के लिए नहीं मिला। बेशक मैंने कुछ गलत समझा होगा लेकिन मैं जो चाहता था उसे प्राप्त नहीं कर सका।

इसलिए मैं अपना समाधान साझा करना चाहता हूं।

मेरा पहला विचार था कि स्ट्रेटटाइम% डब्ल्यू का विवरण दिया गया है:

पहले सप्ताह की पहली तारीख के रूप में पहले सोमवार से शुरू होने वाले चालू वर्ष की सप्ताह संख्या

अगर मैंने स्थापित किया कि प्रत्येक वर्ष का पहला सोमवार क्या है, तो मैं दिनांक डब्ल्यू के मूल्य के बराबर सूचकांक के साथ तिथि सीमाओं की एक श्रृंखला की गणना कर सकता हूं। उसके बाद मैं स्ट्रैटाइम का उपयोग करके फ़ंक्शन को कॉल कर सकता था।

तो यहां जाता है:

कार्यक्रम:

<?php

/*
 *  function to establish scope of week given a week of the year value returned from strftime %W
 */

// note strftime %W reports 1/1/YYYY as wk 00 unless 1/1/YYYY is a monday when it reports wk 01
// note strtotime Monday [last, this, next] week - runs sun - sat

function date_Range_For_Week($W,$Y){

// where $W = %W returned from strftime
//       $Y = %Y returned from strftime

    // establish 1st day of 1/1/YYYY

    $first_Day_Of_Year = mktime(0,0,0,1,1,$Y);

    // establish the first monday of year after 1/1/YYYY    

    $first_Monday_Of_Year = strtotime("Monday this week",(mktime(0,0,0,1,1,$Y)));   

    // Check for week 00 advance first monday if found
    // We could use strtotime "Monday next week" or add 604800 seconds to find next monday
    // I have decided to avoid any potential strtotime overhead and do the arthimetic

    if (strftime("%W",$first_Monday_Of_Year) != "01"){
        $first_Monday_Of_Year += (60 * 60 * 24 * 7);
    }

    // create array to ranges for the year. Note 52 wks is the norm but it is possible to have 54 weeks
    // in a given yr therefore allow for this in array index

    $week_Start = array();
    $week_End = array();        

    for($i=0;$i<=53;$i++){

        if ($i == 0){   
            if ($first_Day_Of_Year != $first_Monday_Of_Year){
                $week_Start[$i] = $first_Day_Of_Year;
                $week_End[$i] = $first_Monday_Of_Year - (60 * 60 * 24 * 1);
            } else {
                // %W returns no week 00
                $week_Start[$i] = 0;
                $week_End[$i] = 0;                              
            }
            $current_Monday = $first_Monday_Of_Year;
        } else {
            $week_Start[$i] = $current_Monday;
            $week_End[$i] = $current_Monday + (60 * 60 * 24 * 6);
            // find next monday
            $current_Monday += (60 * 60 * 24 * 7);
            // test for end of year
            if (strftime("%W",$current_Monday) == "01"){ $i = 999; };
        }
    };

    $result = array("start" => strftime("%a on %d, %b, %Y", $week_Start[$W]), "end" => strftime("%a on %d, %b, %Y", $week_End[$W]));

    return $result;

    }   

?>

उदाहरण:

// usage example

//assume we wish to find the date range of a week for a given date July 12th 2011

$Y = strftime("%Y",mktime(0,0,0,7,12,2011));
$W = strftime("%W",mktime(0,0,0,7,12,2011));

// use dynamic array variable to check if we have range if so get result if not run function

$date_Range = date_Range . "$Y";

isset(${$date_Range}) ? null : ${$date_Range} = date_Range_For_Week($W, $Y);

echo "Date sought: " . strftime(" was %a on %b %d, %Y, %X time zone: %Z",mktime(0,0,0,7,12,2011)) . "<br/>";
echo "start of week " . $W . " is " . ${$date_Range}["start"] . "<br/>";
echo "end of week " . $W . " is " . ${$date_Range}["end"];

आउटपुट:

> Date sought: was Tue on Jul 12, 2011, 00:00:00 time zone: GMT Daylight
> Time start of week 28 is Mon on 11, Jul, 2011 end of week 28 is Sun on
> 17, Jul, 2011

मैंने 2018 समेत कई वर्षों में इसका परीक्षण किया है जो अगले वर्ष है जब 1/1/2018 = सोमवार। अब तक सही दिनांक सीमा प्रदान करने लगता है।

तो मुझे आशा है कि इससे मदद मिलती है।

सादर


हफ्ते के दिनों की तलाश करने वाले लोगों के लिए सप्ताहांत (1-52) रविवार को शुरू होने के बाद यहां मेरा छोटा काम है। सप्ताह की जांच करने में सही समय लगता है और इसे सभी काम करने के लिए मूल्य 1-9 पैड करता है।

$week = 2; $year = 2009;

$week = (($week >= 1) AND ($week <= 52))?($week-1):(1);

$dayrange  = array(7,1,2,3,4,5,6);

for($count=0; $count<=6; $count++) {
    $week = ($count == 1)?($week + 1): ($week);
    $week = str_pad($week,2,'0',STR_PAD_LEFT);
    echo date('d m Y', strtotime($year."W".$week.($dayrange[$count]))); }

$week_number = 40;
$year = 2008;

for($day=1; $day<=7; $day++)
{
    echo date('m/d/Y', strtotime($year."W".$week_number.$day))."\n";
}

यह विफल हो जाएगा यदि $week_number 10 से कम है।

//============Try this================//

$week_number = 40;
$year = 2008;

if($week_number < 10){
   $week_number = "0".$week_number;
}

for($day=1; $day<=7; $day++)
{
    echo date('m/d/Y', strtotime($year."W".$week_number.$day))."\n";
}

//==============================//

एक और कोड हेहे:

public function getAllowedDays($year, $week) {
    $weekDaysArray = array();
    $dto = new \DateTime();
    $dto->setISODate($year, $week);

    for($i = 0; $i < 7; $i++) {
        array_push($weekDaysArray, $dto->format('Y-m-d'));
        $dto->modify("+1 days");
    }

    return $weekDaysArray;
}

पीएचपी

$week_number = 40;
$year = 2008;
for($day=1; $day<=7; $day++)
{
    echo date('m/d/Y', strtotime($year."W".$week_number.$day))."\n";
}

पद के नीचे था क्योंकि मैं एक बेवकूफ था जिसने प्रश्न को सही तरीके से नहीं पढ़ा था, लेकिन सोमवार से शुरू होने वाले एक सप्ताह में तारीखें प्राप्त की जाएंगी, तारीख को नहीं, सप्ताह की संख्या ..

पीएचपी में , PHP पोस्ट मैनुअल पेज पर इस पोस्ट से अनुकूलित:

function week_from_monday($date) {
    // Assuming $date is in format DD-MM-YYYY
    list($day, $month, $year) = explode("-", $_REQUEST["date"]);

    // Get the weekday of the given date
    $wkday = date('l',mktime('0','0','0', $month, $day, $year));

    switch($wkday) {
        case 'Monday': $numDaysToMon = 0; break;
        case 'Tuesday': $numDaysToMon = 1; break;
        case 'Wednesday': $numDaysToMon = 2; break;
        case 'Thursday': $numDaysToMon = 3; break;
        case 'Friday': $numDaysToMon = 4; break;
        case 'Saturday': $numDaysToMon = 5; break;
        case 'Sunday': $numDaysToMon = 6; break;   
    }

    // Timestamp of the monday for that week
    $monday = mktime('0','0','0', $month, $day-$numDaysToMon, $year);

    $seconds_in_a_day = 86400;

    // Get date for 7 days from Monday (inclusive)
    for($i=0; $i<7; $i++)
    {
        $dates[$i] = date('Y-m-d',$monday+($seconds_in_a_day*$i));
    }

    return $dates;
}

week_from_monday('07-10-2008') से आउटपुट देता है:

Array
(
    [0] => 2008-10-06
    [1] => 2008-10-07
    [2] => 2008-10-08
    [3] => 2008-10-09
    [4] => 2008-10-10
    [5] => 2008-10-11
    [6] => 2008-10-12
)

मुझे इस समाधान के साथ एक समस्या मिली। मुझे सप्ताह संख्या शून्य-पैड करना था या नहीं तो यह तोड़ रहा था।

मेरा समाधान अब इस तरह दिखता है:

$week_number = 40;
$year = 2008;
for($day=1; $day<=7; $day++)
{
    echo date('m/d/Y', strtotime($year."W".str_pad($week_number,2,'0',STR_PAD_LEFT).$day))."\n";
}






date