it-swarm.com.de

Berechnung der Wochentage unter Angabe einer Wochennummer

Wenn eine Wochennummer gegeben ist, z. date -u +%W, wie berechnen Sie die Wochentage ab Montag?

Beispiel RFC-3339 Ausgabe für Woche 40:

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

PHP

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


Der folgende Beitrag war, weil ich ein Idiot war, der die Frage nicht richtig gelesen hat, aber die Termine in einer Woche ab Montag erhalten wird, da das Datum und nicht die Wochennummer angegeben ist.

In PHP, angepasst von diesem Beitrag auf der PHP -Datum-Handbuchseite :

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

Ausgabe von week_from_monday('07-10-2008') ergibt:

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
)
59
ConroyP

Wenn Sie über das Zend Framework verfügen, können Sie dazu die Zend_Date-Klasse verwenden:

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

Da diese Frage und die akzeptierte Antwort veröffentlicht wurden, machen die Klassen DateTime dies viel einfacher: -

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

Dies hat den zusätzlichen Vorteil, dass auf Schaltjahre usw. geachtet wird.

Sieh es funktioniert . Einschließlich der schwierigen Wochen 1 und 53.

6
vascowhite

Diese Berechnung hängt stark von Ihrem Wohnort ab. In Europa beginnen wir beispielsweise die Woche mit einem Montag, in den USA ist der Sonntag der erste Tag der Woche. In Großbritannien ist Woche 1 am 1. Januar, andere Länder beginnen Woche 1 mit der Woche, die den ersten Donnerstag des Jahres enthält.

Weitere allgemeine Informationen finden Sie unter http://en.wikipedia.org/wiki/Week#Week_number

4
Martin Liesén
$week_number = 40;
$year = 2008;

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

Dies schlägt fehl, wenn $week_number weniger als 10 ist. 

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

//==============================//
2
Nicolas

Diese Funktion liefert die Zeitstempel der Wochentage, in denen $ Datum gefunden wurde. Wenn $ date nicht angegeben ist, wird "jetzt" angenommen. Wenn Sie lesbare Datumsangaben den Zeitstempeln vorziehen, übergeben Sie ein Datumsformat an den zweiten Parameter. Wenn Sie Ihre Woche nicht am Montag beginnen (Glück), geben Sie für den dritten Parameter einen anderen Tag ein.

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

Also week_dates () sollte etwas zurückgeben wie ...

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

Ein weiterer Code hehe:

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;
}
1
Miton Leon
$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>';

als date () Objekt von php date php verwenden

0
Peter Breuls

Ich hatte die gleiche Frage nur mit strftime anstelle von datei als Ausgangspunkt, d. H. Ich habe mit% W eine Wochennummer abgeleitet. Eine Überprüfung mehrerer ähnlicher Beiträge und insbesondere das Ausprobieren einiger der oben genannten Ansätze brachte mich nicht zu der Lösung, die ich wollte. Natürlich habe ich vielleicht etwas missverstanden, aber ich konnte nicht das bekommen, was ich wollte.

Ich möchte daher meine Lösung mitteilen. 

Mein erster Gedanke war, dass die Beschreibung von strftime% W gegeben ist:

wochennummer des aktuellen Jahres, beginnend mit dem ersten Montag als der erste Tag der ersten Woche

wenn ich herausfand, was der erste Montag eines jeden Jahres ist, könnte ich ein Array von Datumsbereichen mit einem Index berechnen, der dem Wert von% W entspricht. Danach konnte ich die Funktion mit strftime aufrufen.

So geht es also:

Die Funktion:

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

    }   

?>

Beispiel:

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

Ausgabe:

> 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

Ich habe dies über mehrere Jahre getestet, darunter 2018, also das nächste Jahr, wenn der 01.01.2014 = Montag ist. Bisher scheint der korrekte Datumsbereich zu liefern.

Ich hoffe also, dass das hilft.

Grüße

0
codepuppy

Eine andere Lösung:

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

Beispiel:

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

Aus:

2014-02-10
2014-02-16
0
joan16v

Ich habe ein Problem mit dieser Lösung gefunden. Ich musste die Wochennummer auf Null setzen, sonst brach sie.

Meine Lösung sieht jetzt so aus:

$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";
}
0
Yashvit

Für diejenigen, die nach den Wochentagen suchen, denen die Wochennummer (1-52) zugewiesen ist Ab einem Sonntag dann ist hier meine kleine Arbeit. Berücksichtigt, dass die Woche im richtigen Bereich ist, und füllt die Werte von 1 bis 9 auf, damit alle funktionieren.

$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]))); }
0
Jamie