2011-01-15 17 views

risposta

38

È possibile utilizzare mktime e date:

$first_minute = mktime(0, 0, 0, date("n"), 1); 
$last_minute = mktime(23, 59, 59, date("n"), date("t")); 

Questo è per il mese corrente. Se si desidera averlo per un mese, è necessario modificare di conseguenza il parametro del mese e del giorno.

Se si desidera generare per ogni mese, si può solo ciclo:

$times = array(); 
for($month = 1; $month <= 12; $month++) { 
    $first_minute = mktime(0, 0, 0, $month, 1); 
    $last_minute = mktime(23, 59, 59, $month, date('t', $first_minute)); 
    $times[$month] = array($first_minute, $last_minute); 
} 

DEMO

+1

credo in linea "$ last_minute = mktime (23, 59, 0, $ al mese, la data ('t', $ first_minute));" devi sostituire "$ first_minute" con "$ month", perché vuoi conoscere il numero di giorni in questo stesso mese. –

+2

@PascalKlein è corretto con $ first_minute perché la funzione date prevede il timestamp come secondo argomento, non il numero del mese. – luka8088

+1

@Pascal: cosa ha detto luka ... vedere http: //php.net/manual/en/function.date.php ... '$ first_minute' potrebbe essere un nome variabile confuso in questo caso, è davvero un timestamp del primo minuto del mese e 'date ('t', $ first_minute)' estrae il numero di giorni del mese nel timestamp. –

3

Usa mktime per la generazione di timestamp da ora/mese/giorno/... valori e cal_days_in_month a ottenere il numero di giorni in un mese:

$month = 1; $year = 2011; 
$firstMinute = mktime(0, 0, 0, $month, 1, $year); 
$days = cal_days_in_month(CAL_GREGORIAN, $month, $year); 
$lastMinute = mktime(23, 59, 0, $month, $days, $year); 
+1

Grazie, ma meglio usare $ lastMinute = mktime (23, 59, 59, $ month, $ days, $ year); – Kir

+0

@ Kir bene, sarebbe l'ultimo secondo, ma hai ragione - Aggiornato. – phihag

13

con PHP 5.3, si può fare

$oFirst = new DateTime('first day of this month'); 
$oLast = new DateTime('last day of this month'); 
$oLast->setTime(23, 59, 59); 

In PHP 5.2

Nota: come AllThecode rilevare nei commenti qui sotto, prossimo esempio solo opere se si fa la parte $oFirst prima. Se aggiungi +1 month a new DateTime, il risultato salterà un mese in più rispetto all'ultimo giorno del mese (a partire da php 5.5.9).

$oToday = new DateTime(); 
$iTime = mktime(0, 0, 0, $oToday->format('m'), 1, $oToday->format('Y')); 
$oFirst = new DateTime(date('r', $iTime)); 

$oLast = clone $oFirst; 
$oLast->modify('+1 month'); 
$oLast->modify('-1 day'); 
$oLast->setTime(23, 59, 59); 
+1

ATTENZIONE! Sono quasi bruciato da questo.-1 mese il 31 di un mese darà il 1 ° dello stesso mese, NON il mese precedente! –

+0

@AllTheCode, è "-1 mese" un errore nel codice o nel commento? è "+1 mese" nell'esempio 5.2 sopra. – enobrev

+1

Siamo spiacenti, non ho usato l'esempio originale. Lo stesso problema è per +1 mese. Se oggi è il 31 ottobre (che è) e aggiungi un mese, riceverai il 1 ° dicembre, non il 30 novembre. –

2

Questo richiede PHP> 5.2 e la necessità regolazione per i "minuti" parte

$year = ...; // this is your year 
$month = ...; // this is your month 
$month = ($month < 10 ? '0' . $month : $month); 
$start = new DateTime($year . '-' . $month . '-01 00:00:00'); 
$end = $start->modify('+1 month -1 day -1 minute'); //perhaps this need 3 "->modify" 
echo $start->format('U'); 
echo $end->format('U'); 

(non testato)

Rif: http://www.php.net/manual/en/class.datetime.php

3

penso meglio allora

$first_minute = mktime(0, 0, 0, date("n"), 1); 
$last_minute = mktime(23, 59, 0, date("n"), date("t")); 

è:

$first_minute = mktime(0, 0, 0, date("n"), 1); 
$last_minute = mktime(23, 59, 0, date("n") + 1, 0); 
+0

Perché è meglio? – Kir

+0

È meglio perché la data ("t") è un processo extra che non è necessario se si utilizza un giorno di 0 con il mese + 1. [una chiamata in meno alla data()] – Artistan

Problemi correlati