Bir hafta numarası verilen haftanın günleri hesaplanması

9 Cevap php

Bir hafta sayısı göz önüne alındığında, örneğin date -u +%W, nasıl Pazartesi başlayarak bu hafta içinde gün hesaplanır?

Hafta 40 Örnek RFC-3339 çıktı:

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

9 Cevap

PHP

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


Below post was because I was an idiot who didn't read the question properly, but will get the dates in a week starting from Monday, given the date, not the week number..

In PHP, this post on uyarlanan PHP date manual page,

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') verir çıkışı

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
)

Zend Framework var ise bunu yapmak için Zend_Date sınıfını kullanabilirsiniz:

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>';

Bu hesaplama ölçüde nerede yaşadığınıza bağlı olarak değişir. Örneğin, Avrupa'da, ABD'de Pazar haftanın ilk günü, bir Pazartesi ile hafta başlar. İngiltere'de hafta 1 1 Ocak tarihinde, diğerleri ülkeler yılın ilk Perşembe içeren haftalık 1. başlar.

Sen http://en.wikipedia.org/wiki/Week#Week_number daha fazla genel bilgi bulabilirsiniz

Bu fonksiyon $ tarih bulundu olduğu haftanın gün damgaları verecektir. $ Tarih verilmiş değil ise, "şimdi." Varsayar Eğer damgaları okunabilir tarihleri ​​tercih ederseniz, ikinci parametre içine bir tarih biçimi geçmektedir. Eğer Pazartesi (şanslı) üzerinde hafta başlayacak yoksa, üçüncü parametre için farklı bir gün içinde geçer.

function week_dates($date = null, $format = null, $start = 'monday') {
  // is date given? if not, use current time...
  if(is_null($date)) $date = 'now';

  // get the timestamp of the day that started $date's week...
  $weekstart = strtotime('last '.$start, strtotime($date));

  // add 86400 to the timestamp for each day that follows it...
  for($i = 0; $i < 7; $i++) {
    $day = $weekstart + (86400 * $i);
    if(is_null($format)) $dates[$i] = $day;
    else $dates[$i] = date($format, $day);
  }

  return $dates;
}

Yani week_dates() gibi bir şey dönmesi gerekir ...

Array ( 
  [0] => 1234155600 
  [1] => 1234242000 
  [2] => 1234328400 
  [3] => 1234414800 
  [4] => 1234501200
  [5] => 1234587600
  [6] => 1234674000
)

Bu soru ve cevabı kabul yazılmıştır yana DateTime sınıfları yapmak için bu kadar basit olun: -

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));

Bu vb artık yıl bakımı avantajına sahiptir.

See it working. Zor haftalar 1 ve 53 de dahil olmak üzere.

I found a problem with this solution. I had to zero-pad the week number or else it was breaking.

Benim çözüm şimdi bu gibi görünüyor:

$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";
}
$week_number = 40;
$year = 2008;

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

{[(0)] 10} 'den daha az ise, bu başarısız olur.

//============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";
}

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

Pazartesi Pazar (veya herhangi bir başlangıç ​​gün) - Ben sadece% WI kullanarak yani strftime'da bir hafta numarasını türetilmiş olan benim başlangıç ​​noktası olarak yerine tarih strftime bu hafta için tarih aralığını bilmek istedim kullanarak aynı soru vardı. Birkaç benzer mesajların ve özellikle yukarıdaki yaklaşımların bir çift dışarı çalışırken istediğim çözüm beni alamadım bir incelemesi. Tabii ki bir şeyler yanlış olabilir ama ben ne istediğini alamadı.

Bu yüzden benim çözüm paylaşmak istiyorum.

Benim ilk düşünce strftime% W açıklaması verilir ki:

week number of the current year, starting with the first Monday as the first day of the first week

Her yılın ilk Pazartesi günü ben bugüne bir dizi hesaplayabilirsiniz ne kurulmuş ise% W. değerine eşit bir dizin aralıkları Bundan sonra ben strftime kullanarak işlevini diyebiliriz.

Yani burada gider:

Fonksiyonu:

<?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;

    }   

?>

Örnek:

// 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"];

Çıktı:

> 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

Ben ne zaman 2018/01/01 = Pazartesi önümüzdeki yıl 2018 gibi birkaç yıl içinde bu test ettik. Şimdiye kadar doğru tarih aralığını sunmak gibi görünüyor.

Yani bu yardımcı olacağını umuyorum.

Selamlar

Başka bir çözüm:

//$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);
}

Örnek:

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

Out:

2014-02-10
2014-02-16