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
PHP
$week_number = 40;
$year = 2008;
for($day=1; $day<=7; $day++)
{
echo date('m/d/Y', strtotime($year."W".$week_number.$day))."\n";
}
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
)
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>';
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.
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
$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";
}
//==============================//
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
)
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;
}
$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
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
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
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";
}
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]))); }