2014-11-10 8 views
8

Ho bisogno di un modo per serializzare e date unserialize che sono potenzialmente molto lontano nel passato, per esempio -10000date Memorizzazione con più-che-4 cifre anni

ho guardo ISO8601, ma non sembra per supportare anni con più di quattro cifre. (O almeno, pitone librerie ho provato non lo fanno.)

Le diverse soluzioni che posso pensare:

  • cambiamento l'anno prima la serializzazione/deserializzazione, dare al parsing/formattazione biblioteca e risolvere il problema indietro (sembra hacky)
  • definire il mio proprio formato, come year:month:day:hour:minute:second (che è reinventare la ruota, dal momento che ho per gestire fusi orari, ecc)
  • Utilizzare un timestamp UNIX, senza limiti o qualcosa di equivalente (può traboccare in alcuni linguaggi di programmazione e ancora il materiale del fuso orario)
  • Le date di memorizzazione precedenti allo -9999 (o 0) differiscono rispetto a quelle successive, poiché non vi era alcun problema di fuso orario/anni bisestili/... in quel momento. (due formati diversi nello stesso posto)

Vedi qualche altro modo migliore di questi? O consigliamo uno di quelli?

+1

Questa domanda sulla DBA può essere utile: http://dba.stackexchange.com/questions/7077/best-way-to-handle-dates-prior-to-1000-ad-in-mysql – naththedeveloper

+0

"* librerie python che ho provato non. *" - Per favore, dimmi o mostraci cosa hai provato finora e quali sono stati i risultati. –

risposta

0

Dai un'occhiata alla classe FlexiDate - potrebbe essere utile per i tuoi scopi.

Non è un modo standard di conformità in qualsiasi modo, ma potrebbe fare il trucco per voi

1

Si potrebbe prendere una pagina dal popolo astronomia. Le mappe celesti rappresentano la precessione a lungo periodo della rotazione della Terra stabilendo epoche. (Il cielo è diverso se stai guardando ora contro il 10.000 aC.)

Crea una nuova classe che abbia un numero di "epoca" e un modello di facciata della classe di data corrente. La nuova classe contiene due campi privati ​​per epoca e data interna. Il costruttore imposta l'epoca su (anno div 10000) e crea un'istanza della data interna con (anno modulo 10000). Spero che il resto del modello di facciata sia ovvio come penso.

0

ISO 8601 supporta le date con più di 4 digits se, e solo se, sono firmate. L'unica funzione di PHP so di che supporta questa funzionalità è

DateTime::setISODate($Year, $WeekOffset, $DayofWeekOffset) 

Ovviamente è un dolore da usare, perché richiede il calcolo delle compensazioni da perfettamente bene paia giorno/mese. Detto questo, dovresti essere in grado di creare date BC firmando l'anno con un '-' (segno meno).

allora si sarebbe uscita la data con

DateTime::format("c") 

Nella produzione questo sarebbe un aspetto simile:

$date= new DateTime(); 

$date->setISODate(-100000,$WeekOffset, $DoWOs); 

echo $date->format("c"); 
Problemi correlati