Der erste Tag des aktuellen Monats in PHP mit date_modify als DateTime-Objekt


157

Ich kann den Montag dieser Woche bekommen mit:

$monday = date_create()->modify('this Monday');

Ich möchte mit der gleichen Leichtigkeit den 1. dieses Monats bekommen. Wie kann ich das erreichen?


Äh, ich bin in Schwierigkeiten, John Conde hat die Frage beantwortet, die ich beantwortet habe, aber ich vergesse zu erwähnen, dass es an 5.2 funktionieren muss, also werde ich tatsächlich Mr-
sks

Antworten:


260

Erfordert PHP 5.3 zum Arbeiten ("erster Tag von" wird in PHP 5.3 eingeführt). Ansonsten ist das obige Beispiel der einzige Weg, dies zu tun:

<?php
    // First day of this month
    $d = new DateTime('first day of this month');
    echo $d->format('jS, F Y');

    // First day of a specific month
    $d = new DateTime('2010-01-19');
    $d->modify('first day of this month');
    echo $d->format('jS, F Y');

    // alternatively...
    echo date_create('2010-01-19')
      ->modify('first day of this month')
      ->format('jS, F Y');

In PHP 5.4+ können Sie dies tun:

<?php
    // First day of this month
    echo (new DateTime('first day of this month'))->format('jS, F Y');

    echo (new DateTime('2010-01-19'))
      ->modify('first day of this month')
      ->format('jS, F Y');

Wenn Sie eine präzise Methode bevorzugen und Jahr und Monat bereits in numerischen Werten angegeben haben, können Sie Folgendes verwenden date():

<?php
    echo date('Y-m-01'); // first day of this month
    echo date("$year-$month-01"); // first day of a month chosen by you

9
Beachten Sie, dass Sie nicht durchlaufen müssen, ->modify()wenn Sie nur den ersten Tag des aktuellen Monats möchten . Sie können 'first day of this month'direkt an den DateTime-Konstruktor übergeben : $date = new DateTime('first day of this month').
Ich

333

Hier ist was ich benutze.

Erster Tag des Monats:

date('Y-m-01');

Ultimo:

date('Y-m-t');

10
Dies ist IMO bei weitem die einfachste und am besten lesbare Möglichkeit, dies zu lösen, wenn Sie lediglich eine Zeichenfolgendarstellung des Datums benötigen.
Markus Amalthea Magnuson

5
Letzter Tag des Monats konnte dann mit gepackt werden date('Y-m-t');.
Mark Tomlin

7
Zu Ihrer Information: Das Datum 't' ('Ym-t') gibt immer die Anzahl der Tage in diesem Monat an. Eine großartige und einfache Möglichkeit, den letzten Tag des aktuellen Monats abzurufen.
Pascal Klein

1
Wenn ich damit versuche, den Wochentag zu ermitteln, erhalte date('w', '2015-05-01');ich den Tag zuvor anstelle des tatsächlichen Tages. (Dies würde mir 4 statt der richtigen 5 geben).
PBwebD

5
Das ist einfach genial. Ich habe es ein wenig erweitert, um die $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
minimalen

32

Das ist alles was Sie brauchen:

$week_start = strtotime('last Sunday', time());
$week_end = strtotime('next Sunday', time());

$month_start = strtotime('first day of this month', time());
$month_end = strtotime('last day of this month', time());

$year_start = strtotime('first day of January', time());
$year_end = strtotime('last day of December', time());

echo date('D, M jS Y', $week_start).'<br/>';
echo date('D, M jS Y', $week_end).'<br/>';

echo date('D, M jS Y', $month_start).'<br/>';
echo date('D, M jS Y', $month_end).'<br/>';

echo date('D, M jS Y', $year_start).'<br/>';
echo date('D, M jS Y', $year_end).'<br/>';

4
Dies ist eine saubere Lösung, die jedoch strtotime('first day of this month', time())am ersten Tag zurückgegeben wird und deren Uhrzeit der aktuellen entspricht. Also da, es ist nicht der erste Tag um 0:00 Uhr, der erste Tag und wie es jetzt ist. Dies behebt es strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas

22

Derzeit verwende ich diese Lösung:

$firstDay = new \DateTime('first day of this month');
$lastDay = new \DateTime('last day of this month');

Das einzige Problem, auf das ich gestoßen bin, ist, dass eine seltsame Zeit eingestellt wird. Ich brauchte den richtigen Bereich für unsere Suchoberfläche und kam zu folgendem Ergebnis:

$firstDay = new \DateTime('first day of this month 00:00:00');
$lastDay = new \DateTime('first day of next month 00:00:00');

Das ist cool, aber ich habe einige Probleme am ersten Tag des Monats. Also, wenn heute der 1. September ist, 11 Uhr. Ich werde den 1. August bekommen! Ich muss tatsächlich prüfen, ob es heute der "1." ist, und wenn ja, "jetzt" verwenden. seltsam (Php 7.3.9)
Jacob Christensen

@JacobChristensen hat das noch nicht erlebt. Wie hast du das behoben?
Nikola Petkanski

Sehr wahr, PHP-Nähte sind nicht sehr cool über diese erste und letzte. $ n = new \ DateTime ('erster Tag von'. (new \ DateTime ()) -> Format ('F')); "erster Tag im Januar". Gleiches passiert für die Woche, wenn es Montag ist und es ein bisschen ... frustrierend ist :)
Jacob Christensen

20

Ich benutze einen verrückten Weg, um dies zu tun, indem ich diesen Befehl benutze

$firstDay=date('Y-m-d',strtotime("first day of this month"));
$lastDay=date('Y-m-d',strtotime("last day of this month"));

Das ist alles


6

In PHP 5.2 können Sie verwenden:

<? $d = date_create();
print date_create($d->format('Y-m-1'))->format('Y-m-d') ?>

4

Hässlich (und verwendet Ihren oben genannten Methodenaufruf nicht), funktioniert aber:

echo 'First day of the month: ' . date('m/d/y h:i a',(strtotime('this month',strtotime(date('m/01/y')))));   

aus dem Thema heraus, aber wie würden Sie den letzten Tag des Monats unter dem gleichen Szenario berechnen.
LoneWOLFs

@ LoneWOLFs last day of {$month} {$year}oder last day of this monthbeide funktionieren. Aber denken Sie daran, dass $ month eine Zeichenfolge sein muss, die den Namen des Monats wie "January" bis "Decemember" enthält. Oder Sie könnten einfach verwenden date('Y-m-t');.
Mark Tomlin

3

Sie können es so machen:

$firstday = date_create()->modify('first day January 2010');

3

Ich verwende dies mit einem täglichen Cron-Job, um zu überprüfen, ob ich am ersten Tag eines bestimmten Monats eine E-Mail an meine Partner senden soll. Es sind ein paar Zeilen mehr als die anderen Antworten, aber steinhart.

//is this the first day of the month?
$date = date('Y-m-d');
$pieces = explode("-", $date);
$day = $pieces[2];

//if it's not the first day then stop
if($day != "01") {

     echo "error - it's not the first of the month today";
     exit;

}

2

Mit der Datumsmethode sollten wir in der Lage sein, das Ergebnis zu erhalten. dh; Datum ('N / D / l', mktime (0, 0, 0, Monat, Tag, Jahr));

Beispielsweise

echo date('N', mktime(0, 0, 0, 7, 1, 2017));   // will return 6
echo date('D', mktime(0, 0, 0, 7, 1, 2017));   // will return Sat
echo date('l', mktime(0, 0, 0, 7, 1, 2017));   // will return Saturday

0

Alle diese speziellen PHP-Ausdrücke sind im Geiste von first day of ...großartig, obwohl sie mir immer wieder aus dem Kopf gehen.

Deshalb habe ich mich entschlossen, ein paar grundlegende Datetime-Abstraktionen und eine Menge spezifischer Implementierungen zu erstellen, die von jeder IDE automatisch vervollständigt werden. Es geht darum, welche Art von Dingen zu finden . Wie, today, now, the first day of a previous monthetc. All diese Dinge , die ich aufgelistet habe sind Datetimes. Daher gibt es eine Schnittstelle oder eine abstrakte Klasse, die aufgerufen wird ISO8601DateTime, und bestimmte Datenzeiten, die sie implementieren.

Der Code in Ihrem speziellen Fall sieht folgendermaßen aus:

(new TheFirstDayOfThisMonth(new Now()))->value();

Weitere Informationen zu diesem Ansatz finden Sie in diesem Eintrag .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.