cal_days_in_month()
Scopri come usare cal_days_in_month() in PHP per ottenere il numero di giorni in un mese, con esempi pratici sugli anni bisestili e i calendari.
La funzione PHP cal_days_in_month() restituisce il numero di giorni in un mese per un dato calendario, mese e anno. Poiché gestisce automaticamente gli anni bisestili e i diversi sistemi di calendario, è più affidabile rispetto al codifica fissa dei conteggi dei giorni o al calcolo manuale degli anni bisestili. Questa pagina tratta la sua firma, esempi funzionanti (inclusi gli anni bisestili e il calendario giuliano), le insidie comuni e l'alternativa quotidiana quando l'estensione Calendar non è disponibile.
Sintassi
cal_days_in_month(int $calendar, int $month, int $year): int| Parametro | Descrizione |
|---|---|
$calendar | Calendario da usare: CAL_GREGORIAN, CAL_JULIAN, CAL_JEWISH o CAL_FRENCH. |
$month | Numero del mese nel calendario scelto (1–12 per gregoriano/giuliano). |
$year | L'anno, come intero. |
Restituisce il numero di giorni come int. cal_days_in_month() fa parte dell'estensione Calendar, inclusa con PHP ma che deve essere abilitata (lo è per impostazione predefinita nella maggior parte delle build). Se l'estensione è assente, la funzione non esiste; vedi Senza l'estensione Calendar di seguito.
Utilizzo di base
Passa la costante del calendario, il mese e l'anno:
Questo stampa There are 31 days in January 2022.
Gestione degli anni bisestili
La funzione tiene conto automaticamente degli anni bisestili, quindi febbraio restituisce 28 o 29 senza alcuna logica aggiuntiva da parte tua:
<?php
echo cal_days_in_month(CAL_GREGORIAN, 2, 2020); // 29 — 2020 is a leap year
echo "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 2023); // 28 — 2023 is not
?>Elenco di tutti i mesi di un anno
Un'operazione comune è la creazione di un calendario o di un menu a tendina per le date. Itera sui 12 mesi:
<?php
$year = 2024;
$names = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
for ($month = 1; $month <= 12; $month++) {
$days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
echo "{$names[$month - 1]} $year: $days days\n";
}
?>Per il 2024 (un anno bisestile) questo stampa February 2024: 29 days, mentre ogni altro mese mostra il conteggio consueto.
Utilizzo di un calendario diverso
Cambiando il primo argomento si modifica il sistema di calendario. Il calendario giuliano, ad esempio, tratta il 1900 come anno bisestile, mentre il calendario gregoriano non lo fa:
<?php
echo cal_days_in_month(CAL_JULIAN, 2, 1900); // 29
echo "\n";
echo cal_days_in_month(CAL_GREGORIAN, 2, 1900); // 28
?>Insidie comuni
- Mese o anno non valido: passare un mese fuori dall'intervallo valido (ad esempio
13o0) genera un avviso e restituiscefalse, non un conteggio di giorni. Valida l'input prima di chiamare la funzione. - Type juggling:
falseè liberamente uguale a0. Usa un controllo rigoroso (if ($days === false)) anzichéif (!$days)quando gestisci gli errori. - Dipendenza dall'estensione: la funzione esiste solo quando l'estensione Calendar è caricata. Usa
function_exists('cal_days_in_month')nel codice portabile come guardia.
Senza l'estensione Calendar
Se l'estensione Calendar non è disponibile, la classe DateTime (sempre disponibile) fornisce lo stesso risultato gregoriano tramite il carattere di formato t, che rappresenta il numero di giorni nel mese:
<?php
$date = new DateTime('2024-02-01');
echo $date->format('t'); // 29
?>Questa è l'opzione più portabile per il calendario gregoriano e non richiede estensioni aggiuntive.
Conclusione
cal_days_in_month() restituisce il conteggio dei giorni per un mese in un dato calendario e anno, gestendo per te gli anni bisestili e i sistemi di calendario multipli. Usala quando lavori con l'estensione Calendar o hai bisogno di un calendario non gregoriano; altrimenti DateTime::format('t') è un'alternativa senza dipendenze.
Per continuare a lavorare con le date in PHP, consulta PHP Date and Time e la funzione checkdate() per la validazione di una data gregoriana.
Diagramma
graph LR
A[Input Calendar Type, Month, and Year] -- cal_days_in_month --> B[Output Number of Days]