Erhalten Sie den ersten Tag der Woche in PHP?

124

MM-dd-yyyyKann mir jemand bei einem gegebenen Datumsformat helfen, den ersten Tag der Woche zu bekommen?

Iggy Ma
quelle
4
Was meinst du mit dem ersten Tag der Woche? Meinst du Sonne, Mo? Oder meinst du das Datum des ersten Tages der Woche?
Jeffrey Hines
2
Der erste Tag der Woche ist konstant: Es ist Montag (oder möglicherweise Sonntag). Meinen Sie damit, dass Sie das Datum des Montags vor einem bestimmten beliebigen Datum erhalten möchten?
Jon Cram
Welche Version von PHP - 4 oder 5?
Jon Cram
das Datum des Sonntags der Woche. PHP 5
Iggy Ma
Seltsamerweise bittet er um eine DateTimeLösung und die meisten Antworten liefern sie nicht. =)
Lin

Antworten:

143

Hier ist was ich benutze ...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$ day enthält eine Zahl von 0 bis 6, die den Wochentag darstellt (Sonntag = 0, Montag = 1 usw.).
$ week_start enthält das Datum für den Sonntag der aktuellen Woche als MM-TT-JJJJ.
$ week_end enthält das Datum für den Samstag der aktuellen Woche als MM-TT-JJJJ.

JadedCore
quelle
1
aber es bedeutet den Beginn und das Ende von 'dieser Woche', richtig?
Oki Erie Rinaldi
Was ist, wenn die Wochennummer angegeben wird? und ich möchte, dass es das Start- und Enddatum dieser Woche zurückgibt.
Oki Erie Rinaldi
1
@OkiErieRinaldi Sie sollten wahrscheinlich eine neue Frage öffnen, um die richtige Aufmerksamkeit zu erhalten.
JadedCore
Mach dir keine Sorgen, ich habe es @JadedCore!
Oki Erie Rinaldi
Ich bin mir nicht sicher, warum der andere höher ist. Es funktioniert nicht, aber dieser tut es! 3v4l.org/q6kKY
Jason
67
strtotime('this week', time());

Zeit ersetzen (). Die Methoden für den nächsten Sonntag / letzten Montag funktionieren nicht, wenn der aktuelle Tag Sonntag / Montag ist.

laurentb
quelle
55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley
this weekfunktioniert nicht, wenn Sie immer den vorherigen Wochenbeginn haben müssen, aber @ LewisBuckleys Kommentar macht es.
Smar
Das zweite Argument time()ist optional, wenn Sie heute angeben möchten.
Ifnot
hat bei mir nicht funktioniert, ich musste für YTD, MTD, WTD eine etwas andere Syntax verwenden.
Ron
6
Diese Antwort führt je nach verwendeter PHP-Version zu inkonsistenten Ergebnissen: 3v4l.org/Z3k4E @ LewisBuckleys Lösung ist für alle Versionen konsistent
Chris Baker
62

Sehr einfach zu bedienende strtotimeFunktion :

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

Es unterscheidet sich ein wenig zwischen den PHP-Versionen :

Ausgabe für 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22

Ausgabe für 4.3.5 - 5.2.17

2015-03-23
2015-03-22

Ausgabe für 4.3.0 - 4.3.4

2015-03-30
2015-03-29

Vergleichen bei Edge-Cases

Relative Beschreibungen wie diese Woche haben ihren eigenen Kontext. Das Folgende zeigt die Ausgabe für diese Woche Montag und Sonntag, wenn es ein Montag oder ein Sonntag ist:

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

Againt es unterscheidet sich ein bisschen zwischen PHP-Versionen :

Ausgabe für 5.3.0 - 5.6.6, php7 @ 20140507 - 20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22
2015-03-23
2015-03-29

Ausgabe für 4.3.5 - 5.0.5, 5.2.0 - 5.2.17

2015-03-16
2015-03-22
2015-03-23
2015-03-22

Ausgabe für 5.1.0 - 5.1.6

2015-03-23
2015-03-22
2015-03-23
2015-03-29

Ausgabe für 4.3.0 - 4.3.4

2015-03-23
2015-03-29
2015-03-30
2015-03-29
Raja Rama Mohan Thavalam
quelle
Warum funktioniert das nicht für das Datum 2016-06-05, es gibt Daten für die nächsten Wochen.
1
Vielen Dank dafür, ich habe gerade diesen Code geändert, damit ich einen optionalen Datumsparameter $ dt = $ custom_date? Übergeben kann. strtotime ($ custom_date): time (); $ Montag = Datum ("Ymd", Strtotime ('Montag diese Woche', $ dt)); $ sonntag = Datum ("Ymd", strtotime ('Sonntag diese Woche', $ dt));
Ron Michael
47

Halte es einfach :

<?php    
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

Quelle: PHP-Handbuch

NB: Wie einige Benutzer kommentierten, wird der Wert von $ dateTime geändert.

job3dot5
quelle
edit: Tippfehler oder unbekannte Syntax? Woher kommt das \? $dateTime = new \DateTime('2012-05-14');
Sliq
2
Ich mache dies, um Konflikte mit einem möglichen automatisch geladenen Objekt Ihrer Anwendung zu vermeiden. Das ist wie ein absoluter Pfad oder ein relativer Pfad.
job3dot5
9
@Panique - Die "unbekannte Syntax" ist die Namespace-Syntax von PHP 5.3. Mit Namespacing können Sie einer Klasse einen Namespace gefolgt von einem Backslash voranstellen. Hier verwendet er es ohne Namespace, um die Kernklasse anzugeben. Dies DateTimebedeutet, dass der Code auch dann funktioniert, wenn DateTimeim aktuellen Namespace eine andere Klasse aufgerufen wird .
Spudley
Ist der Tagesname immer auf Englisch?
Marwelln
1
Klonteil funktioniert nicht richtig. Sie sollten zuerst klonen und dann den Klon ausführen, wenn Sie das Original benötigen.
Farid Movsumov
25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

Dies gibt Ihnen den Wochentag des angegebenen Datums an, an dem 0= Sonntag und 6= Samstag. Von dort aus können Sie einfach rückwärts zum gewünschten Tag rechnen.

Yuvalik
quelle
6
Diese Antwort gibt zurück, ob ein bestimmtes Datum Sonntag oder Montag usw. ist. Der Fragesteller hat jedoch nach dem Datum des Sonntags der Woche des angegebenen Datums gefragt, wie in seinem Kommentar zur ursprünglichen Frage erwähnt.
Rakib
19

Diese Frage braucht eine gute DateTime- Antwort: -

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

Ausgabe:-

string '06-10-2013' (length=10)

Dies wird sich mit Jahresgrenzen und Schaltjahren befassen.

vascowhite
quelle
18

BEARBEITEN: Der folgende Link läuft nicht mehr auf der angegebenen PHP-Version. Es läuft auf PHP 5.6, was die Zuverlässigkeit von strtotime verbessert, aber nicht perfekt ist! Die Ergebnisse in der Tabelle sind Live-Ergebnisse aus PHP 5.6.

Für das, was es wert ist, hier eine Aufschlüsselung des wackeligen Verhaltens von strtotime bei der Bestimmung eines konsistenten Referenzrahmens:

http://gamereplays.org/reference/strtotime.php

Grundsätzlich erhalten Sie nur mit diesen Zeichenfolgen zuverlässig das gleiche Datum, unabhängig davon, an welchem ​​Wochentag Sie sich gerade befinden, wenn Sie sie aufrufen:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 
AgmLauncher
quelle
Der Artikel gab auch einen bestimmten Code zur Verwendung an: $ start_of_week = strtotime ("nächster Montag - 1 Woche"); // Wird am Montag der aktuellen Woche ab 00:00:00 Uhr "$ end_of_week = strtotime (" nächster Montag - 1 Sekunde ") zurückkehren; // Wird am Sonntag der aktuellen Woche bis 23:59:59 Uhr"
Scott zurückkehren M. Stolz
11

Der folgende Code sollte mit jedem benutzerdefinierten Datum funktionieren, verwendet nur das gewünschte Datumsformat.

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

Ich habe den Code mit PHP 5.2.17 getestet. Ergebnisse:

Start: 30-07-2012
End: 05-08-2012
Malagana
quelle
1
Beachten Sie, dass dies immer den vorherigen Montag zurückgibt. Wenn also $ custom_date ein Montag ist, wird das Datum des Montags eine Woche früher zurückgegeben.
Hill79
2
Funktioniert nicht richtig, heute ist Sonntag, Ergebnisse sind: Start: 09-09-2013 Ende: 22-09-2013
user2019515
10

Unter der Annahme, dass Montag der erste Tag der Woche ist, funktioniert dies:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
Shasi Kanth
quelle
1
"MM-TT-JJJJ" ist nicht dasselbe wie "YMD". Bitte passen Sie Ihre Antwort an die Besonderheiten der Frage an.
Jewgenij Afanasjew
1
Datum ("MM-TT-JJJJ") gibt das Datum wie folgt aus: NovNov-0202-15151515. Ich hoffe, es sollte sein: Datum ("Mdy"), das ein lesbares Datum ausgibt wie: 02.11.15
Shasi Kanth
"MM-TT-JJJJ" kommt von der Frage. Wenn Sie nicht sicher sind, was es bedeutet, stellen Sie es in einem Kommentar zur Frage. Vielen Dank, dass Sie Ihre Antwort geändert haben.
Jewgenij Afanasjew
9

Wie wäre es damit?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));
birkof
quelle
8
Der letzte Montag am Montag gibt Ihnen den vorherigen Montag.
Ikke
8

Dies ist, was ich benutze, um den ersten und letzten Tag der Woche von jedem Datum zu erhalten . In diesem Fall ist Montag der erste Tag der Woche ...

$date = date('Y-m-d') // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');
Der Bischof
quelle
1
Das ist die wahre Antwort!
Manuel
1
Klappt wunderbar!
Liga
6

Hier betrachte ich Sonntag als ersten und Samstag als letzten Tag der Woche.

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

Ausgabe :

Beginn: 05.08.2012
Ende: 08.11.2012

Irshad Sheikh
quelle
5

Wie wäre es damit?

$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));
Tarquinius Superbus
quelle
4

Versuche dies:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
    return date($format, $mon_ts);
}

$sStartDate = week_start_date($week_number, $year);
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));

(aus diesem Forenthread )

James Skidmore
quelle
Wie bekomme ich die Wochennummer und das Jahr in all dem? Ich habe ein String-Datum im MM-TT-JJJJ-Format
Iggy Ma
4

Dies ist die kürzeste und am besten lesbare Lösung, die ich gefunden habe:

    <?php
    $weekstart = strtotime('monday this week');
    $weekstop = strtotime('sunday this week 23:59:59');
    //echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
    ?>

strtotimeist schneller als new DateTime()->getTimestamp().

Dipser
quelle
Dies ist perfekt, siehe meine Korrektur für australische / britische Daten
Zanderwar
4

Benutz einfach date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));

Kondziutek
quelle
2

Mit der folgenden PHP-Version vor 5.3 erhalten Sie mit der folgenden Funktion einen ersten Tag der Woche mit dem angegebenen Datum (in diesem Fall - Sonntag, 03.02.2013):

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>
David Jashi
quelle
2
$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');

if($today_day != "Mon")
    $start_of_week = date('Ymd', strtotime("last monday"));

if($today_day != "Sun")
                    $end_of_week = date('Ymd', strtotime("next sunday"));
user195257
quelle
2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

Sie müssen zuerst am nächsten Montag und dann am letzten Montag den nächsten Montag bekommen. Wenn also das angegebene Datum Montag ist, wird das gleiche Datum nicht letzte Woche Montag zurückgegeben.

Fedy Venom
quelle
2

Wenn Sie den Montag als Beginn Ihrer Woche wünschen, gehen Sie folgendermaßen vor:

$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));
Henry Weber
quelle
Was macht dies dieser Antwort oder dieser Antwort vorzuziehen ? Mir scheint, es gibt mehr als genug Optionen in den 30 anderen Antworten ...
Mogsdad
Vielen Dank. Dies ist eine einfache Lösung und funktioniert wie ein Zauber.
Oleg Popov
2

Eine clevere Möglichkeit, dies zu tun, besteht darin, PHP Zeitzonenunterschiede und Sommerzeit (DST) verarbeiten zu lassen. Lassen Sie mich Ihnen zeigen, wie das geht.

Diese Funktion generiert alle Tage von Montag bis einschließlich Freitag (praktisch zum Generieren von Wochentagen):

class DateTimeUtilities {
    public static function getPeriodFromMondayUntilFriday($offset = 'now') {
        $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
        $today = $now->setTime(0, 0, 1);

        $daysFromMonday = $today->format('N') - 1;

        $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
        $saturday = $monday->add(new \DateInterval('P5D'));

        return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
    }
}

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
    print $day->format('c');
    print PHP_EOL;
}

Dies gibt die Daten von Montag bis Freitag für die aktuelle Woche zurück. Um dasselbe für ein beliebiges Datum zu tun, übergeben Sie ein Datum als Parameter an DateTimeUtilities ::getPeriodFromMondayUntilFriday:

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
    print $day->format('c');
    print PHP_EOL;
}

//prints 
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00

Nur am Montag interessiert, wie das OP gefragt hat?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00
Nino Škopac
quelle
1

Sie analysieren das Datum mit strptime()und verwenden es date()für das Ergebnis:

date('N', strptime('%m-%d-%g', $dateString));
Soulmerge
quelle
1
<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));

//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);

?>

(Hinweis: MM, TT und JJJJ in der Frage sind keine Standardsyntax für das PHP-Datumsformat. Ich kann nicht sicher sein, was gemeint ist, daher setze ich das $ start_date mit ISO Jahr-Monat-Tag.)

Micahwittman
quelle
1

Ein anderer Weg, es zu tun ....

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());

// 0=Sunday 6=Saturday
if($day!=0){

   $newdate = $date->getTimestamp() - $day * 86400;  //86400 seconds in a day

   // Look for DST change 
   if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
       if($old == 0){
           $newdate -= 3600;  //3600 seconds in an hour
       } else {
           $newdate += 3600;
       }
   }

   $date->setTimestamp($newdate);
}

echo $date->format('D Y-m-d H:i:s');
Michael Pawlowsky
quelle
1

Der einfachste Weg, um den ersten Tag (Montag) der aktuellen Woche zu erhalten, ist:

strtotime("next Monday") - 604800;

Dabei ist 604800 - die Anzahl der Sekunden in 1 Woche (60 * 60 * 24 * 7).

Dieser Code wird nächsten Montag abgerufen und für 1 Woche verringert. Dieser Code funktioniert an jedem Wochentag. Auch wenn heute Montag ist.

Anton Popov
quelle
1

Ich fand das ziemlich frustrierend, da meine Zeitzone australisch ist und das strtotime() britische Daten hasst.

Wenn der aktuelle Tag ein Sonntag ist, strtotime("monday this week")wird der Tag danach zurückgegeben.

Um dies zu überwinden:

Achtung : Dies gilt nur für australische / britische Daten

$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));
Zanderwar
quelle
2
Dies funktioniert auch für USA-Daten. Ich habe dies mit der Newyork-Zeitzone getestet.
Jayesh D
Solange der Sonntag nicht Ihr erster Wochentag ist (Montag in Australien / Großbritannien), ist alles in Ordnung.
Zanderwar
1

Hier ist ein Einzeiler für den ersten Tag der letzten Woche und den letzten Tag der letzten Woche als DateTimeObjekt.

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);
David Baucum
quelle
1
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));
Syed Urooj Waqar
quelle
Nützlich, wenn wir Montag als ersten Tag der Woche (Mo-So) haben.
Kamran Mushtaq
0

Ich bin ein paar Mal auf diese Frage gestoßen und immer überrascht, dass die Datumsfunktionen dies nicht einfacher oder klarer machen. Hier ist meine Lösung für PHP5, die die DateTimeKlasse verwendet:

/**
 * @param DateTime $date A given date
 * @param int $firstDay 0-6, Sun-Sat respectively
 * @return DateTime
 */
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
    $offset = 7 - $firstDay;
    $ret = clone $date;
    $ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
    return $ret;
}

Klonen erforderlich, um eine Änderung des ursprünglichen Datums zu vermeiden.

contrebis
quelle
0

Wie wäre es mit:

$date = "2013-03-18"; 
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';

Es ist nicht der beste Weg, aber ich habe getestet und wenn ich in dieser Woche bin, bekomme ich den richtigen Montag, und wenn ich an einem Montag bin, werde ich diesen Montag bekommen.

CoffeJunky
quelle