Il primo giorno del mese corrente in php usando date_modify come oggetto DateTime


157

Posso ottenere il lunedì di questa settimana con:

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

Vorrei ottenere con la stessa facilità il 1 ° di questo mese. Come posso raggiungerlo?


Uh, sono nei guai, John Conde ha risposto alla domanda a cui ho risposto, ma dimentico di menzionare che deve funzionare al 5.2, quindi userò effettivamente la risposta di Mr-sk ...
pihentagy,

Risposte:


260

Richiede PHP 5.3 per funzionare (il "primo giorno di" è introdotto in PHP 5.3). Altrimenti l'esempio sopra è l'unico modo per farlo:

<?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+ puoi fare questo:

<?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');

Se preferisci un modo conciso per farlo e hai già l'anno e il mese in valori numerici, puoi usare 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
Nota che non devi passare ->modify()se vuoi solo il primo giorno del mese corrente . È possibile passare 'first day of this month'al costruttore DateTime direttamente come: $date = new DateTime('first day of this month').
Sto

334

Ecco cosa uso.

Primo giorno del mese:

date('Y-m-01');

Ultimo giorno del mese:

date('Y-m-t');

10
Questo è l'IMO di gran lunga il modo più semplice e più leggibile per risolverlo, se tutto ciò che serve è una rappresentazione in formato stringa della data.
Markus Amalthea Magnuson,

5
L'ultimo giorno del mese potrebbe essere afferrato usando date('Y-m-t');.
Mark Tomlin,

7
A proposito: la data 't' ('Ym-t') rappresenta sempre il numero di giorni in quel mese. Un modo fantastico e semplice per ottenere l'ultimo giorno del mese in corso.
Pascal Klein,

1
Se lo uso per cercare di ottenere il giorno della settimana, date('w', '2015-05-01');finisco con il giorno prima anziché il giorno effettivo. (Questo mi darebbe 4 invece del 5 corretto).
PBwebD,

5
Questo è semplicemente geniale. Mi sono allargato un po 'per dare i limiti minimo e massimo del tempo nel mese facendo: $monthStart = date('Y-m-01 00:00:00'); $monthEnd = date('Y-m-t 23:59:59');
H2ONOCK

32

Questo è tutto ciò di cui hai bisogno:

$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
Questa è una soluzione accurata, tuttavia strtotime('first day of this month', time())tornerà il primo giorno e l'orario è lo stesso di quello attuale. Quindi lì, non è il primo giorno alle 0:00, il suo primo giorno e come è l'ora. Questo lo risolve strtotime('first day of this month 00:00:00', time()).
Kalle H. Väravas,

22

Attualmente sto usando questa soluzione:

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

L'unico problema che ho riscontrato è che è stato fissato uno strano momento. Avevo bisogno di un intervallo corretto per la nostra interfaccia di ricerca e ho finito con questo:

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

È bello, ma sto riscontrando alcuni problemi nel primo giorno del mese. Quindi, se oggi è il 1 settembre, alle 11. Prenderò il 1 ° agosto! Devo effettivamente verificare se è il "1" oggi e in tal caso utilizzare "ora". weird (Php 7.3.9)
Jacob Christensen,

@JacobChristensen non l'hanno ancora sperimentato. Come l'hai risolto?
Nikola Petkanski,

Molto vero, le cuciture PHP non devono essere molto interessanti su questo primo e ultimo. $ n = new \ DateTime ('primo giorno di'. (new \ DateTime ()) -> format ('F')); "primo giorno di gennaio". Lo stesso succede per la settimana in cui è lunedì ed è un po '... frustrante :)
Jacob Christensen,

20

Uso un modo folle per fare questo è usare questo comando

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

È tutto


6

In php 5.2 puoi usare:

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

4

Brutto (e non usa la tua chiamata di metodo sopra) ma funziona:

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

fuori tema ma come calcoleresti l'ultimo giorno del mese nello stesso scenario.
LoneWOLFs

@LoneWOLFs last day of {$month} {$year}o last day of this monthentrambi funzionano. Ma tieni presente che $ month dovrebbe essere una stringa contenente il nome del mese come "gennaio" fino in fondo a "dicembre". O potresti semplicemente usare date('Y-m-t');.
Mark Tomlin,

3

Puoi farlo in questo modo:

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

3

Lo uso con un lavoro cron giornaliero per verificare se devo inviare un'e-mail il primo giorno di un determinato mese ai miei affiliati. Sono poche più righe delle altre risposte ma solide come una roccia.

//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

usando il metodo della data, dovremmo essere in grado di ottenere il risultato. ie; data ('N / D / l', mktime (0, 0, 0, mese, giorno, anno));

Per esempio

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

Tutte quelle espressioni speciali di php, in spirito di first day of ...sono grandiose, anche se escono dalla mia testa più volte.

Così ho deciso di costruire un paio di astrazioni di base per il datetime e tonnellate di implementazione specifica che vengono completate automaticamente da qualsiasi IDE. Il punto è trovare quale genere di cose. Come, today, now, the first day of a previous month, ecc Tutte queste cose che ho elencato sono datetimes. Quindi, vi è un'interfaccia o una classe astratta chiamata ISO8601DateTimee specifici periodi di dati che la implementano.

Il codice nel tuo caso particolare è simile al seguente:

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

Per ulteriori informazioni su questo approccio, dai un'occhiata a questa voce .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.