2010-08-05 7 views
5

Ho un problema molto strano, Zend_Date sta convertendo il mio timestamp a un anno prima.Bug in Zend_Date (indietro nel tempo)

Nella mia azione:

// Timestamp 
$intTime = 1293922800; 

// Zend_Date object 
$objZendDate = new Zend_Date($intTime); 

// Get date 

echo date('Y-m-d',$intTime).'<br>'; 
echo $objZendDate->get('YYYY-MM-dd'); 

Questo uscite: 2011-01-02 2010-01-02

Qualcuno può dirmi che cosa sto facendo male?

risposta

13

Dal issue tracker ZF sembra che questo è un problema noto:

Recentemente un sacco di utenti ZF sono la presentazione di un bug che Zend_Date restituisce l'anno sbagliato 2009 invece di 2008. Questo è comunque un comportamento previsto, e NON UN BUG!

Dalla FAQ:

Quando si utilizza propri formati nel codice che si potrebbe arrivare ad una situazione in cui si ottiene per esempio 29.12.2009, ma si prevede di ottenere 29.12.2008.

C'è una differenza di un anno: il 2009 invece del 2008. È necessario utilizzare la costante dell'anno inferiore. Vedere questo esempio:

$ date-> toString ('dd.MM.yyyy');

invece di

$ data-> toString ('DD.MM.YYYY');

Dal manuale

Si noti che il formato ISO di default è diverso dal formato di PHP che può essere irritante se non è stato utilizzato in precedenti. Soprattutto gli specificatori di formato per Anno e Minuto spesso non vengono utilizzati nel modo previsto.

Per anno ci sono due specificatori disponibili che sono spesso errati. L'identificatore Y per l'anno ISO e lo specificatore y per l'anno reale. La differenza è piccola ma significativa. Y calcola l'anno ISO, che viene spesso utilizzato per i formati del calendario. Vedi ad esempio il 31. Dicembre 2007. L'anno reale è il 2007, ma è il primo giorno della prima settimana della settimana 1 dell'anno 2008. Quindi, se stai usando 'gg.mm.aaaa', otterrai '31 .Dicembre.2007 ', ma se si utilizza' gg.AAAAA ', si ottiene '31 .Dicembre.2008'. Come vedi questo non è un bug ma un comportamento atteso a seconda degli specificatori usati.

Per il minuto la differenza non è così grande. ISO usa l'identificatore m per il minuto, a differenza di PHP che usa i. Quindi se non ottieni nessun minuto nel tuo formato controlla se hai usato lo specificatore giusto.

+0

Grazie, stupido da parte mia che non ho guardato oltre. –

+1

Vorrei che avrei visto questo 4 ore fa! – ashurexm

+0

Questo dovrebbe essere contrassegnato come la risposta – Sonny

0

Per aggiungere a zwip's answer, ciò che accade dietro le quinte è che il formato della data YYYY-MM-dd è in realtà tradotto in o\-m\-d, che viene quindi passato alla funzione di PHP date() internamente con il timestamp che hai fornito.

Come menzionato nell'altra risposta, e nella documentazione per il formato o nella pagina date format, il calcolo dell'anno in base alla settimana ISO può a volte risultare in un anno diverso dal valore che ci si aspetta.

Problemi correlati