Come trovare l'ultimo giorno del mese dalla data?


382

Come posso ottenere l'ultimo giorno del mese in PHP?

Dato:

$a_date = "2009-11-23"

Voglio il 30/11/2009; e dato

$a_date = "2009-12-23"

Voglio il 2009-12-31.

Risposte:


805

trestituisce il numero di giorni nel mese di una determinata data (consultare la documentazione perdate ):

$a_date = "2009-11-23";
echo date("Y-m-t", strtotime($a_date));

99
Questo fallirà dopo l'anno 2038. Quindi, invece di strtotime, dovrebbe essere usata la funzione DateTime. Il seguente codice funzionerà senza il problema dell'Anno 2038: $ d = new DateTime ('2009-11-23'); echo $ d-> format ('Ymt');
Mugunth

74
@Mugunth Se lavorerai con le date 24 anni in futuro potresti riscontrare problemi prima del 2038, tuttavia i server stanno già passando a un'architettura a 64 bit che ci fornirà circa 292 miliardi di anni per correggere il problema.
Nessuno

1
in procedurale -> $ date1 = $ anno .'- '. $ mese; $ d = date_create_from_format ('Y-m', $ date1); $ last_day = date_format ($ d, 't');
Kayla,

11
Con DateTimete puoi fare qualcosa del genere:(new DateTime('2009-11-23'))->modify('last day of')
Victor

Se stai usando Carbon PHP è possibile utilizzare DaysInMonth getter
astroanu

119

Il codice che utilizza strtotime () avrà esito negativo dopo l'anno 2038. (come indicato nella prima risposta in questo thread) Ad esempio, provare a utilizzare quanto segue:

$a_date = "2040-11-23";
echo date("Y-m-t", strtotime($a_date));

Darà risposta come: 1970-01-31

Quindi, invece di strtotime, dovrebbe essere usata la funzione DateTime. Il seguente codice funzionerà senza il problema dell'anno 2038:

$d = new DateTime( '2040-11-23' ); 
echo $d->format( 'Y-m-t' );

17
Avrò 71 anni e mi ritirerò da allora, quindi non è un problema per me! j / k Ma seriamente gente - fate attenzione a questo avvertimento!
Volomike,

17
Ciò presuppone che tu stia eseguendo una versione a 32 bit di PHP.
Nessuno

perché questo fatto allarmante sullo strtotime non è menzionato nel documento php php.net/manual/de/function.strtotime.php ?
Adam,

1
@Adam Ora è, non sono sicuro se fosse quando hai controllato. php.net/manual/de/…
Mave,

1
A partire dal 2018, il strtotimecodice mi dà questo risultato: 2040-11-30
Jee

104

So che è un po 'tardi, ma penso che ci sia un modo più elegante di farlo PHP 5.3+usando la classe DateTime :

$date = new DateTime('now');
$date->modify('last day of this month');
echo $date->format('Y-m-d');

20
In una riga: $ date = new DateTime ('last day of this month');
Harold,

6
Potresti voler aggiungere $ date-> modifica ('ultimo giorno di questo mese') -> setTime (23,59,59); se si desidera utilizzare questa data Ora per il confronto in cui il tempo è importante. (Questo ti dà l'ultimo secondo del mese)
omgitsdrobinoha,

5
Funziona così:$date = new DateTime('last day of 2020-2');

4
@Giovanni ti sbagli. l'ultimo giorno viene calcolato utilizzando l'oggetto $ date e non la data di sistema. Provalo cambiando la prima riga con questo:$date = DateTime::createFromFormat('m/d/Y', '1/10/2014');
Hannoun Yassir,

5
Se dovessi pensare o almeno provare quello che ti ho chiesto di fare, vedresti che questo mese indica il valore del mese nell'oggetto DateTime e non la data del sistema. Se non riesci a digitare / eseguire il codice php questo potrebbe aiutare: sandbox.onlinephpfunctions.com/code/…
Hannoun Yassir


24

Questo dovrebbe funzionare:

$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/>';

18

Cosa c'è di sbagliato - Il più elegante per me sta usando DateTime

Mi chiedo di non vedere DateTime::createFromFormat, one-liner

$lastDay = \DateTime::createFromFormat("Y-m-d", "2009-11-23")->format("Y-m-t");

2
Sono d'accordo. Questa soluzione (classe DateTime) è molto meglio dell'uso delle vecchie funzioni datetime.
schellingerht,

17

È possibile creare una data per il primo del mese successivo e quindi utilizzare strtotime("-1 day", $firstOfNextMonth)


un metodo alternativo che usa lo stesso approccio è quello di dare a mktime il 0 ° giorno del mese successivomktime(0, 0, 0, $month+1, 0, $year);
George

Per quanto mi riguarda, l'uso di strtotime()ed mktime()è sconsigliato bec. di bug noti come la determinazione della data al limite dei mesi e le calaculazioni dell'anno bisestile. Poiché DateTimeè disponibile, è necessario utilizzare questa classe per evitare problemi in futuro. Come ho detto molte volte prima di me, entrambe funzionano strtotime()e mktime()falliranno dopo il 2038. Ecco perché ho effettuato il downvoting ...
Paul T. Rawkeen,

@ PaulT.Rawkeen Questa risposta ha più di 4 anni. Come per qualsiasi cosa su Internet, l'età dovrebbe essere un fattore nel valutare la pertinenza e l'utilità. Inoltre, IMHO, il tempo dimezzato per tutto ciò che riguarda la tecnologia è particolarmente breve.
nikc.org,

@ nikc.org Sono d'accordo, soprattutto per quanto riguarda il tempo della vita per tutte le soluzioni tecniche e i modi di risolvere i problemi. In questo caso particolare, la risposta ha un numero relativamente alto di voti e probabilmente qualcuno ( programmatore junior ) considererà questa risposta come una soluzione accettabile perché. è breve ed elegante :) e probabilmente otterrà il risultato atteso, ma col passare del tempo, questo modo di risolvere questo tipo di problemi diventa difficile e dovremmo avvertire di tali fatti quando è possibile. Cordiali saluti .
Paul T. Rawkeen,

16

Prova questo, se stai usando PHP 5.3+,

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Per trovare la data dell'ultimo mese successivo, modificare come segue,

 $date->modify('last day of 1 month');
 echo $date->format('Y-m-d');

e così via..



10

Puoi trovare l'ultimo giorno del mese in diversi modi. Ma semplicemente puoi farlo usando PHP strtotime () e la funzione date (). Immagino che il tuo codice finale sarebbe simile a questo:

$a_date = "2009-11-23";
echo date('Y-m-t',strtotime($a_date));

Dimostrazione dal vivo

Ma se stai usando PHP> = 5.2 ti consiglio vivamente di usare il nuovo oggetto DateTime. Ad esempio come di seguito:

$a_date = "2009-11-23";
$date = new DateTime($a_date);
$date->modify('last day of this month');
echo $date->format('Y-m-d');

Dimostrazione dal vivo

Inoltre, puoi risolverlo usando la tua funzione come di seguito:

/**
 * Last date of a month of a year
 *
 * @param[in] $date - Integer. Default = Current Month
 *
 * @return Last date of the month and year in yyyy-mm-dd format
 */
function last_day_of_the_month($date = '')
{
    $month  = date('m', strtotime($date));
    $year   = date('Y', strtotime($date));
    $result = strtotime("{$year}-{$month}-01");
    $result = strtotime('-1 second', strtotime('+1 month', $result));

    return date('Y-m-d', $result);
}

$a_date = "2009-11-23";
echo last_day_of_the_month($a_date);

Grazie per la tua funzione, funziona come mi aspettavo :)
Mankeomorakort,

7

Se usi l' estensione Carbon API per PHP DateTime, puoi ottenere l'ultimo giorno del mese con:

$date = Carbon::now();
$date->addMonth();
$date->day = 0;
echo $date->toDateString(); // use toDateTimeString() to get date and time 

In realtà, se imposti il ​​giorno su -1, otterrà l'ultimo tranne uno. Quindi è necessario impostare il giorno su 0 per ottenere l'ultimo giorno. $date->day = 0;
Giovanne Afonso,

grazie @GiovanneAfonso che è corretto. Ho impostato il giorno su 0 e ho testato la risposta.
eaykin,

1
Se si utilizza Carbon, un approccio one-liner consiste nell'utilizzare: Carbon :: Now () -> endOfMonth (). Tuttavia, endOfMonth () è un modificatore, quindi usa "clone" se hai una variabile esistente che contiene una data Carbon (o la data verrà modificata).
Charlie Dalsass,

4

Puoi anche usarlo con datetime

$date = new \DateTime();
$nbrDay = $date->format('t');
$lastDay = $date->format('Y-m-t');

4
$date1 = $year.'-'.$month; 
$d = date_create_from_format('Y-m',$date1); 
$last_day = date_format($d, 't');

2

Usare Zend_Date è abbastanza semplice:

$date->setDay($date->get(Zend_Date::MONTH_DAYS));

2

Se hai un mese, ottieni l'ultima data del mese,

public function getLastDateOfMonth($month)
    {
        $date = date('Y').'-'.$month.'-01';  //make date of month 
        return date('t', strtotime($date)); 
    }

$this->getLastDateOfMonth(01); //31

1

Ecco una funzione completa:

public function get_number_of_days_in_month($month, $year) {
    // Using first day of the month, it doesn't really matter
    $date = $year."-".$month."-1";
    return date("t", strtotime($date));
}

Ciò produrrebbe quanto segue:

echo get_number_of_days_in_month(2,2014);

Uscita: 28


1

Ci sono modi per ottenere l'ultimo giorno del mese.

//to get last day of current month
echo date("t", strtotime('now'));

//to get last day from specific date
$date = "2014-07-24";
echo date("t", strtotime($date));

//to get last day from specific date by calendar
$date = "2014-07-24";
$dateArr=explode('-',$date);
echo cal_days_in_month(CAL_GREGORIAN, $dateArr[1], $dateArr[0]); 

1

Sono in ritardo, ma ci sono alcuni semplici modi per farlo, come detto:

$days = date("t");
$days = cal_days_in_month(CAL_GREGORIAN, date('m'), date('Y'));
$days = date("j",mktime (date("H"),date("i"),date("s"),(date("n")+1),0,date("Y")));

Usare mktime () è il mio obiettivo per un controllo completo su tutti gli aspetti del tempo ... IE

echo "<br> ".date("Y-n-j",mktime (date("H"),date("i"),date("s"),(11+1),0,2009));

Impostando il giorno su 0 e spostando il mese in alto 1, si otterrà l'ultimo giorno del mese precedente. 0 e numeri negativi hanno l'effetto simile nelle diverse argomentazioni. PHP: mktime - Manuale

Come alcuni hanno detto, lo strtotime non è il modo più solido di procedere e poco se nessuno è altrettanto versatile.


1

Sto usando strtotime con cal_days_in_month come segue:

$date_at_last_of_month=date('Y-m-d', strtotime('2020-4-1
+'.(cal_days_in_month(CAL_GREGORIAN,4,2020)-1).' day'));


0

Un altro modo usando mktime e non date ('t'):

$dateStart= date("Y-m-d", mktime(0, 0, 0, 10, 1, 2016)); //2016-10-01
$dateEnd = date("Y-m-d", mktime(0, 0, 0, 11, 0, 2016)); //This will return the last day of october, 2016-10-31 :)

Quindi in questo modo calcola se è 31,30 o 29


0

Estensione API Carbon per PHP DateTime

Carbon::parse("2009-11-23")->lastOfMonth()->day;

o

Carbon::createFromDate(2009, 11, 23)->lastOfMonth()->day;

tornerà

30

-1
function first_last_day($string, $first_last, $format) {
    $result = strtotime($string);
    $year = date('Y',$result);
    $month = date('m',$result);
    $result = strtotime("{$year}-{$month}-01");
    if ($first_last == 'last'){$result = strtotime('-1 second', strtotime('+1 month', $result)); }
    if ($format == 'unix'){return $result; }
    if ($format == 'standard'){return date('Y-m-d', $result); }
}

http://zkinformer.com/?p=134


-2

Questo è un modo molto più elegante per ottenere la fine del mese:

  $thedate = Date('m/d/Y'); 
  $lastDayOfMOnth = date('d', mktime(0,0,0, date('m', strtotime($thedate))+1, 0, date('Y', strtotime($thedate)))); 

-3

È possibile utilizzare " t" nella funzione data per ottenere il numero del giorno in un determinato mese.

Il codice sarà qualcosa del genere:

function lastDateOfMonth($Month, $Year=-1) {
    if ($Year < 0) $Year = 0+date("Y");
    $aMonth         = mktime(0, 0, 0, $Month, 1, $Year);
    $NumOfDay       = 0+date("t", $aMonth);
    $LastDayOfMonth = mktime(0, 0, 0, $Month, $NumOfDay, $Year);
    return $LastDayOfMonth;
}

for($Month = 1; $Month <= 12; $Month++)
    echo date("Y-n-j", lastDateOfMonth($Month))."\n";

Il codice si spiega da sé. Quindi spero che sia d'aiuto.

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.