2009-05-29 2 views
27

Ich versuche, die Woche Bereich mit Sonntag als Startdatum, und ein Referenzdatum, sagen $date, aber ich kann es einfach nicht scheinen, es herauszufinden.Get Start-und End Tage für eine bestimmte Woche in PHP

Zum Beispiel, wenn ich $ date als 2009-05-01 hätte, würde ich 2009-04-26 und 2009-05-02 bekommen. 2009-05-10 würde 2009-05-10 und 2009-05-16 ergeben. Meine aktuellen Code sieht wie folgt aus (ich kann mich nicht erinnern, wo ich es aus angehoben, wie ich die URL in meinen Kommentaren weglegen vergessen):

function x_week_range(&$start_date, &$end_date, $date) 
{ 
    $start_date = ''; 
    $end_date = ''; 
    $week = date('W', strtotime($date)); 
    $week = $week; 

    $start_date = $date; 

    $i = 0; 
    while(date('W', strtotime("-$i day")) >= $week) { 
     $start_date = date('Y-m-d', strtotime("-$i day")); 
     $i++; 
    } 

    list($yr, $mo, $da) = explode('-', $start_date); 

    $end_date = date('Y-m-d', mktime(0, 0, 0, $mo, $da + 6, $yr)); 
} 

Ich erkannte alle es taten 7 Tage zum aktuellen hinzufügen war Datum. Wie würdest du das machen?

Antwort

81

Ich würde advantange von strtotime awesomeness nehmen PHP:

function x_week_range(&$start_date, &$end_date, $date) { 
    $ts = strtotime($date); 
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts); 
    $start_date = date('Y-m-d', $start); 
    $end_date = date('Y-m-d', strtotime('next saturday', $start)); 
} 

Getestet auf die Daten, die Sie zur Verfügung gestellt und es funktioniert. Mir gefällt aber nicht besonders die ganze Referenz, die Sie haben. Wenn dies meine Aufgabe ist, würde ich es so sein:

function x_week_range($date) { 
    $ts = strtotime($date); 
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts); 
    return array(date('Y-m-d', $start), 
       date('Y-m-d', strtotime('next saturday', $start))); 
} 

Und es so nennen:

list($start_date, $end_date) = x_week_range('2009-05-10'); 

Ich bin kein großer Fan von Mathe, wie dies für Dinge zu tun. Termine sind knifflig und ich bevorzuge es, dass PHP es herausfinden kann.

+2

habe ich die im Anschluss an die letzte zu bekommen Sonntag Datum formatiert: Datum ('Ym-d', strtotime ('letzten Sonntag')) –

+3

Gib der PHP5 DateTime Klasse einen Versuch! – jjwdesign

+0

@John M, siehe unten meinen Kommentar darüber, wie "letzter Sonntag" problematisch sein kann, wenn heute Sonntag ist und du __this__ Woche willst. – cdmo

0

ehrlich zu sein, ich Probleme haben den Code zu verstehen, Sie auf dem Laufenden;)

ich so etwas wie dies erraten sollte es tun:

function get_week($date) { 
     $start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60; 
     $end = $start + 6 * 24 * 60 * 60; 
     return array('start' => strftime('%Y-%m-%d', $start), 
        'end' => strftime('%Y-%m-%d', $end)); 
} 
0

Ohne so viel String-Manipulation zu tun, können Sie einige tun einfache Mathematik auf den Zeitstempeln.

function getDateRange(&$start, &$end, $date) { 
    $seconds_in_day = 86400; 
    $day_of_week = date("w", $date); 
    $start = $date - ($day_of_week * $seconds_in_day); 
    $end = $date + ((6 - $day_of_week) * $seconds_in_day); 
} 
2

Hier ist meine Version, die auf Clays einen ähnlichen Begriff verwendet:

/** 
* Start of the week 
* 
* 0 = Sun, 1 = Mon, etc. 
*/ 
define('WEEK_START', 0); 

/** 
* Determine the start and end dates for 
* the week in which the specified date 
* falls 
* 
* @param $date Date in week 
* @param $start Week start (out) 
* @param $end Week end (out) 
*/ 
function week_bounds($date, &$start, &$end) { 
    $date = strtotime($date); 
    // Find the start of the week, working backwards 
    $start = $date; 
    while(date('w', $start) > WEEK_START) { 
     $start -= 86400; // One day 
    } 
    // End of the week is simply 6 days from the start 
    $end = date('Y-m-d', $start + (6 * 86400)); 
    $start = date('Y-m-d', $start); 
} 

leicht getestet. Der Code ist möglicherweise nicht kugelsicher oder behandelt Daten aus der Vergangenheit oder Zukunft. Benutzung auf eigene Gefahr. Tauchen Sie den Code nicht in Wasser ein. Zeigen Sie den Code nicht denen einer nervösen Veranlagung oder mit einem Hass auf das Dollarzeichen. Nicht an Tieren getestet. Sicher für Vegetarier geeignet. Der Autor garantiert, dass der Code niemals mit Ihnen sprechen wird. In dem unwahrscheinlichen Fall, dass der Code versucht, Sie in eine Konversation einzubeziehen, rät Ihnen der Autor, alle Ratschläge zu ignorieren.

8

Scheinbar ‚w‘ Formatierung Wert von date() oder die Format-Methode eines Datetime-Objekt wird den Tag der Woche als Nummer zurück (standardmäßig 0 = Sonntag, 1 = Montag, usw.)

Sie können dies nehmen und den Wert als Tage vom aktuellen Tag abziehen, um den Anfang der Woche zu finden.

$start_date = new DateTime("2009-05-13"); 
$day_of_week = $start_date->format("w"); 

$start_date->modify("-$day_of_week day"); 

$ start_date wird nun zum Sonntag dieser Woche gleich sein, von dort können Sie 7 Tage fügen Sie das Ende der Woche zu bekommen oder was-haben-Sie.

+0

Dasselbe kann mit der Datumsfunktion durchgeführt werden: '$ day_of_week date ('w', strtotime ($ start_date));' '$ sonntag = datum ('Ym-d', strtotime ('-'. $ Day_of_week . 'Tage', strtotime ($ start_date))); ' –

1

Bei dem Versuch, eine schlankere Version der akzeptierte Antwort von Paolo Bergantino, entdeckte ich eine sehr schöne Art und Weise zu finden, dieses zu erhalten getan:

function x_week_range2($date) { 
    $ts = strtotime($date); 
    $start = strtotime('sunday this week -1 week', $ts); 
    $end = strtotime('sunday this week', $ts); 
    return array(date('Y-m-d', $start), date('Y-m-d', $end)); 
} 

Der ‚Sonntag dieser Woche‘ string bedeutet immer „The Sunday an der Ende dieser Woche. " Wenn es für einen Zeitstempel verwendet wird, der auf einen Sonntag fällt, ist dies der folgende Sonntag. Auf diese Weise können Sie den Ternäroperator in Paolas Lösung vermeiden.

18

Für alle, die immer noch mktime(), strtotime() und andere PHP-Funktionen verwenden ... geben Sie der PHP5 DateTime Klasse einen Versuch. Ich war zuerst zögerlich, aber es ist wirklich einfach zu bedienen. Vergessen Sie nicht, clone() zu verwenden, um Ihre Objekte zu kopieren.

Bearbeiten: Dieser Code wurde vor kurzem bearbeitet, um den Fall zu behandeln, in dem der aktuelle Tag Sonntag ist. In diesem Fall müssen wir den vergangenen Samstag bekommen und dann einen Tag hinzufügen, um Sonntag zu bekommen.

$dt_min = new DateTime("last saturday"); // Edit 
$dt_min->modify('+1 day'); // Edit 
$dt_max = clone($dt_min); 
$dt_max->modify('+6 days'); 

Dann formatieren, wie Sie es brauchen.

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')'; 

Stellen Sie sicher, Ihre Zeitzone früh in Ihrem Code festzulegen.

date_default_timezone_set('America/New_York'); 
+1

Wenn ich nicht falsch lese, bin ich nicht sicher, ob diese Logik funktionieren wird, wenn heute Sonntag ist. Wenn heute Sonntag ist und Sie ein 'DateTime' -Objekt von' letzten Sonntag' machen, wird PHP den vorherigen Sonntag, nicht den aktuellen ausgeben. Wenn also das heutige Datum der 28.02.2016 ist, würde der obige Code "Diese Woche 21.02.2016 - 27.02.2016" widerspiegeln (effektiv die letzte Woche. Montag bis Samstag würde dieses Problem verbergen. Ich würde etwas vorschlagen wie '$ dt_min = new DateTime (" letzter Samstag + 24 Stunden ");' – cdmo

+1

Gut catch cdmo! Ich habe den Code geändert, um zu reflektieren. – jjwdesign

3

Base auf @ jjwdesign Antwort, entwickelte ich eine Funktion, die den Anfang und das Ende einer Woche in einem bestimmten Zeitraum mit der Datetime-Klasse berechnen kann. WIRD AUF PHP ARBEITEN 5.3.0 ++

Der Unterschied ist, dass Sie den Tag einstellen können Sie als „Anfang“ wollen zwischen 0 (Montag) und 6 (Sonntag).

Hier ist die Funktion:

if(function_exists('grk_Week_Range') === FALSE){ 
    function grk_Week_Range($DateString, $FirstDay=6){ 
     # Valeur par défaut si vide 
     if(empty($DateString) === TRUE){ 
      $DateString = date('Y-m-d'); 
     } 

     # On va aller chercher le premier jour de la semaine qu'on veut 
     $Days = array(
      0 => 'monday', 
      1 => 'tuesday', 
      2 => 'wednesday', 
      3 => 'thursday', 
      4 => 'friday', 
      5 => 'saturday', 
      6 => 'sunday' 
     ); 

     # On va définir pour de bon le premier jour de la semaine  
     $DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); 
     $DT_Max = clone($DT_Min); 

     # On renvoie les données 
     return array(
      $DT_Min->format('Y-m-d'), 
      $DT_Max->modify('+6 days')->format('Y-m-d') 
     ); 
    } 
} 

Ergebnisse:

print_r(grk_Week_Range('2013-08-11 16:45:32', 0)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 1)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 2)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 3)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 4)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 5)); 
print_r(grk_Week_Range('2013-08-11 16:45:32', 6)); 

Array 
(
    [0] => 2013-07-29 
    [1] => 2013-08-04 
) 
Array 
(
    [0] => 2013-07-30 
    [1] => 2013-08-05 
) 
Array 
(
    [0] => 2013-07-31 
    [1] => 2013-08-06 
) 
Array 
(
    [0] => 2013-07-25 
    [1] => 2013-07-31 
) 
Array 
(
    [0] => 2013-07-26 
    [1] => 2013-08-01 
) 
Array 
(
    [0] => 2013-07-27 
    [1] => 2013-08-02 
) 
Array 
(
    [0] => 2013-07-28 
    [1] => 2013-08-03 
) 
-1

von PHP Datetime-doc:

<?php 
$date = new DateTime(); 

$date->setISODate(2008, 2); 
$startDay = $date->format('Y-m-d'); 

$date->setISODate(2008, 2, 7); 
$endDay = $date->format('Y-m-d'); 
?> 
1

Damit wird die "Woche" Anzahl von einem bestimmten Datum erhalten.

//October 29, 2009 is my birthday 
echo $week date('W', strtotime('2009-10-29')); 
//OUTPUT: 44 
//October 29 is the 44th week in the year 2009 

Jetzt übergeben Sie die Parameter für getWeekDates Funktion als "Jahr (2009)" und "$ Woche".

function getWeekDates($year, $week, $start=true){ 
     $from = date("Y-m-d", strtotime("{$year}-W{$week}-1")); //Returns the date of monday in week 
     $to = date("Y-m-d", strtotime("{$year}-W{$week}-7")); //Returns the date of sunday in week 

     if($start) { 
      return $from; 
     } else { 
      return $to; 
     } 
     //return "Week {$week} in {$year} is from {$from} to {$to}."; 
    } 

Weitere Informationen entnehmen Sie bitte den Link http://blog.ekini.net/2009/07/09/php-get-start-and-end-dates-of-a-week-from-datew/

0

Basierend auf David Bélanger-Version (leider, meine rep. Wird mir nicht erlauben, auf seinen Posten Kommentar als Reaktion zu schreiben ..).

Wenn das Eingabedatum Montag ist und der erste Wochentag als Montag festgelegt ist, wird die ursprüngliche Version der vorherigen Woche zurückgegeben, nicht aktuell. Hier ist das kleine Update (mit dem Rest der orig.Funktion):

if(function_exists('grk_Week_Range') === FALSE){ 
function grk_Week_Range($DateString, $FirstDay=6){ 

    if(empty($DateString) === TRUE){ 
     $DateString = date('Y-m-d'); 
    } 

    # fix 
    $dayOfWeek = date('N', strtotime($DateString)); 
    if ($dayOfWeek == ($FirstDay +1)) { $whichWeek = 'this '; } 
    else { $whichWeek = 'last '; } 

    $Days = array(
     0 => 'monday', 
     1 => 'tuesday', 
     2 => 'wednesday', 
     3 => 'thursday', 
     4 => 'friday', 
     5 => 'saturday', 
     6 => 'sunday' 
    ); 

    # fix 
    $DT_Min = new DateTime($whichWeek.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); 
    $DT_Max = clone($DT_Min); 

    return array(
     $DT_Min->format('Y-m-d'), 
     $DT_Max->modify('+6 days')->format('Y-m-d') 
    ); 
} 
} 
1

Sie jetzt Datetime kann benutzen Sie Start-/Enddatum der Woche (n)

function getDateRangeForAllWeeks($start, $end){ 
    $fweek = getDateRangeForWeek($start); 
    $lweek = getDateRangeForWeek($end); 
    $week_dates = []; 
    while($fweek['sunday']!=$lweek['sunday']){ 
     $week_dates [] = $fweek; 
     $date = new DateTime($fweek['sunday']); 
     $date->modify('next day'); 

     $fweek = getDateRangeForWeek($date->format("Y-m-d")); 
    } 
    $week_dates [] = $lweek; 

    return $week_dates; 
} 

function getDateRangeForWeek($date){ 
    $dateTime = new DateTime($date); 
    $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); 
    $sunday = clone $dateTime->modify('Sunday this week'); 
    return ['monday'=>$monday->format("Y-m-d"), 'sunday'=>$sunday->format("Y-m-d")]; 
} 

Nutzungs

print_r(getDateRangeForWeek("2016-05-07")); 

print_r(getDateRangeForAllWeeks("2015-11-07", "2016-02-15"));