2010-07-16 13 views
9

qui sono alcune espressioni di debug ho messo in Eclipse, se non mi credete:PHP: strtotime restituisce false per una data futura?

"strtotime("2110-07-16 10:07:47")" = (boolean) false  
"strtotime("2110-07-16")" = (boolean) false 

sto usando nella mia funzione che restituisce una data casuale tra le date di inizio e fine:

public static function randomDate($start_date, $end_date, $format = DateTimeHelper::DATE_FORMAT_SQL_DATE) 
    { 
     if($start_date instanceof DateTime)  $start_date = $start_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS); 
     if($end_date instanceof DateTime)  $end_date = $end_date->format(DateTimeHelper::DATE_FORMAT_YMDHMS); 

     // Convert timetamps to millis 
     $min = strtotime($start_date); 
     $max = strtotime($end_date); 

     // Generate random number using above bounds 
     $val = rand($min, $max); 

     // Convert back to desired date format 
     return date($format, $val); 
    } 

Qualche idea su come ottenerlo per restituire l'orario giusto per una data futura?

grazie!

+3

Ci crediamo, tranne il comportamento previsto per i valori di data che stai passando al di fuori dell'intervallo di date di 32 bit PHP –

+3

Dalla documentazione di PHP: L'intervallo valido di un timestamp è in genere da Fri, 13 Dic 1901 20 : 45: 54 UTC a Mar, 19 gennaio 2038 03:14:07 UTC. (Queste sono le date che corrispondono ai valori minimi e massimi per un intero con segno a 32 bit.) Inoltre, non tutte le piattaforme supportano i timestamp negativi, pertanto l'intervallo di date potrebbe essere limitato a non prima dell'epoca Unix. Ciò significa che ad es. le date precedenti al 1 gennaio 1970 non funzioneranno su Windows, alcune distribuzioni Linux e alcuni altri sistemi operativi. PHP 5.1.0 e versioni più recenti però superano questa limitazione. –

+0

sto usando php 5.3 = S 5.2 sul mio server live. non dovrebbe funzionare, allora? – Garrett

risposta

11

Se si vuole lavorare con date che non rientrano nell'intervallo di date intero a 32 bit, quindi utilizzare dateTime PHP oggetti

try { 
    $date = new DateTime('2110-07-16 10:07:47'); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
    exit(1); 
} 

echo $date->format('Y-m-d'); 
+0

è buono in php 5.2? – Garrett

+0

, sembra che stia per uccidere la mia funzione randomDate. come posso creare una data casuale con un DateTime? – Garrett

+2

come si accetta questa risposta quando la domanda era come ottenere un timestamp unix? – mvds

12

Provare a tenerlo prima di Mar, 19 Gen 2038 03:14:07 UTC, quando l'epoca timestamp unix per sistemi a 32 bit si ribalta!

è ancora descritto nel manuale a http://php.net/strtotime

edit: appena testato: E 'risolto installando un sistema operativo a 64 bit e appropriata la versione a 64 bit di php. Credo che abbiamo tempo sufficiente per correggere un bug millennio reincarnato:

$one = strtotime("9999-12-31 23:59:59"); 
$two = strtotime("10000-01-01 00:00:00"); 
var_dump($one); 
var_dump($two); 

int(253402297199) 
bool(false) 
+1

Ri: Modifica - Si noti che il PHP a 64 bit (VC9 Thread safe) su Vista 64-bit utilizza ancora l'intervallo di tempo intero con segno a 32 bit per i valori di data –

+0

Presumo che ciò sia dovuto al fatto che 'strtotime()' non è una funzione di php , ma solo un pezzo di piping per connettersi a (g) libc (almeno in unix land) – mvds

+0

Forse, sono stato piuttosto irritato quando l'ho scoperto mentre facevo test di date su varie piattaforme di recente. È anche interessante notare che i formati delle stringhe di date passati al costruttore dateTime accettano un numero di formati che rifiuta strtotime; ma non ho guardato gli interni per vedere cosa stanno usando i due –

2

non puoi convertire le date che si verificano dopo il tempo di rollover UNIX (2038)

+0

Gah ... picchiato come un figliastro di zenzero. – PaulJWilliams

3

Da the PHP manual:

L'intervallo valido di un timestamp è in genere da Fri, 13 Dic 1901 20:45:54 GMT a Mar, 19 Gen 2038 03:14:07 GMT. (Queste sono le date che corrispondono ai valori minimo e massimo per un intero con segno a 32 bit). Tuttavia, prima di PHP 5.1.0 questo intervallo era limitato dal 01-01-1970 al 19-01-2038 su alcuni sistemi (ad esempio Windows).

Consulta anche: Year 2038 problem - Wikipedia

1

Semplice sostituzione di strtotime

$date = '2199-12-31T08:00:00.000-06:00'; 

echo date('Y-m-d', strtotime($date)); // fails with 1970 result 

echo date_format( date_create($date) , 'Y-m-d'); // works perfect with 5.2+ 

Posta effettiva here.

+0

non sta stampando la data, signore –

Problemi correlati