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?

pihentagy
quelle
Ä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
John Conde
quelle
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');
Etienne Dupuis
quelle
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/>';
kaleazy
quelle
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');
Nikola Petkanski
quelle
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

Jorge Ricardo Sanchez Cocunubo
quelle
6

In PHP 5.2 können Sie verwenden:

<? $d = date_create();
print date_create($d->format('Y-m-1'))->format('Y-m-d') ?>
pihentagy
quelle
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')))));   
mr-sk
quelle
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');
Thomas
quelle
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;

}
Craig Edmonds
quelle
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
Jacob Nelson
quelle
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 .

Vadim Samokhin
quelle