2014-11-10 15 views
8

muszę drogę do serializacji i termin unserialize które są potencjalnie daleko w przeszłości, na przykład -10000Zapisywanie daty z więcej niż 4-cyfrowa lat

raz pierwszy spojrzeć na ISO8601, ale nie wydaje się do obsługi lat z więcej niż czterema cyframi. (Albo przynajmniej, biblioteki Python próbowałem nie.)

różnych roztworów mogę myśleć:

  • zmian przed rokiem szeregowania/deserializacji, dać go do parsowania/formatowania biblioteki i naprawić je z powrotem (dźwięki hacky)
  • określić mój własny format, jak year:month:day:hour:minute:second (który jest odkrywanie koła na nowo, ponieważ mam do obsługi stref czasowych, itd.)
  • Użyj znacznik czasu UNIX bez granic lub coś równoważnego (może przelewać się niektóre języki programowania, a wciąż rzeczy w strefie czasowej)
  • Przechowuj daty przed -9999 (lub 0) inaczej niż po, ponieważ nie było w tym czasie problemu dotyczącego strefy czasowej/roku przestępnego/.... (dwa różne formaty w tym samym miejscu)

Czy widzisz inny sposób, który byłby lepszy od tych? Lub polecić jedną z nich?

+1

To pytanie na DBA mogą być przydatne: http://dba.stackexchange.com/questions/7077/best-way-to-handle-dates-before-to-1000-ad-in-mysql – naththedeveloper

+0

"* biblioteki python, których próbowałem nie. *" - Powiedz lub pokaż nam, co próbujesz do tej pory i jakie były wyniki. –

Odpowiedz

0

Spójrz na klasę FlexiDate - może być przydatna dla twoich celów.

To nie jest sposób standardy zgodności w jakikolwiek sposób, ale może to załatwi za Ciebie

1

Można zabrać stronę od ludzi astronomii. Mapy nieba stanowią długookresową precesję wirowania Ziemi poprzez ustanawianie epok. (Niebo jest inne, jeśli patrzysz teraz na 10 000 pne).

Utwórz nową klasę, która ma numer "epoki" i wzór fasady twojej aktualnej klasy daty. Nowa klasa zawiera dwa prywatne pola dla epoki i daty wewnętrznej. Twój konstruktor ustawia epokę na (rok div 10000) i tworzy instancję wewnętrzną z (rok modulo 10000). Mam nadzieję, że reszta wzoru fasady jest tak oczywista, jak myślę.

0

ISO 8601 obsługuje daty o więcej niż 4 digits tylko wtedy, gdy są podpisane. Jedynym PHP funkcja wiem, że obsługuje funkcjonalność ta jest

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

Oczywiście jest to ból w użyciu, ponieważ wymaga obliczenia przesunięcia z doskonale dobry dzień/miesiąc parach. Powiedział, że powinieneś być w stanie stworzyć daty BC, podpisując rok znakiem "-" (znak minus).

Wtedy bym wyświetlamy datę z

DateTime::format("c") 

W produkcji będzie to wyglądać mniej więcej tak:

$date= new DateTime(); 

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

echo $date->format("c"); 
Powiązane problemy