2014-11-10 11 views
8

Ich muß einen Weg zur Serialisierung und unserialize Daten, die potenziell weit weg in der Vergangenheit sind zum Beispiel -10000Speicher von Terminen mit mehr-als-4-stellige Jahren

ich zum ersten Mal bei ISO8601 aussehen, aber es scheint nicht, um Jahre mit mehr als vier Ziffern zu unterstützen. (Oder zumindest Python-Bibliotheken habe ich versucht, dies nicht tun.)

Die verschiedenen Lösungen, die ich mir vorstellen kann:

  • der Jahreswechsel vor der Serialisierung/Deserialisierung, geben Sie es an die Analyse/Bibliothek Formatierung und befestigen sie es zurück (klingt hacky)
  • mein eigenes Format definieren, wie year:month:day:hour:minute:second (dass das Rad neu zu erfinden, da ich Zeitzonen umgehen müssen, etc.)
  • Verwenden sie einen UNIX-Zeitstempel ohne Grenzen oder gleichwertig etwas (Überlauf-in einige Programmiersprachen und immer noch die Zeitzone Zeug)
  • Speichern Sie Daten vor -9999 (oder 0) anders als die nach, da es zu dieser Zeit kein Zeitzonenproblem/Schaltjahre/... gab. (zwei verschiedene Formate an der gleichen Stelle)

Siehst du einen anderen Weg, der besser wäre als diese? Oder einen von denen empfehlen?

+1

Diese Frage auf DBA nützlich sein können: http://dba.stackexchange.com/questions/7077/best-way-to-handle-dates-vorher-zu-1000-ad-in-mysql – naththedeveloper

+0

"* Python-Bibliotheken habe ich versucht, nicht. *" - Bitte erzählen oder zeigen Sie uns, was Sie versucht haben so weit und was waren die Ergebnisse. –

Antwort

0

Werfen Sie einen Blick auf FlexiDate Klasse - es könnte für Ihre Zwecke nützlich sein.

Es ist kein Standard-Compliance-Weg in irgendeiner Weise, aber es könnte für Sie

1

Sie den Trick eine Seite aus der Astronomie Menschen nehmen könnte. Sky Maps erklären sie eine lange Zeit Präzession der Erde Spin durch Etablierung von Epochen. (Der Himmel ist anders, wenn Sie jetzt gegen 10.000 BC suchen.)

Erstellen Sie eine neue Klasse mit einer "Epoch" -Nummer und einem Fassadenmuster Ihrer aktuellen Datumsklasse. Die neue Klasse enthält zwei private Felder für epoch und internal-date. Ihr Konstruktor setzt epoch auf (Jahr div 10000) und instanziiert das interne Datum mit (Jahr modulo 10000). Ich hoffe, dass der Rest des Fassadenmusters so offensichtlich ist wie ich denke.

0

ISO 8601 unterstützt Daten mit mehr als 4 digits wenn und nur wenn sie signiert sind. Die einzige Funktion PHP ich kenne, unterstützt diese Funktionalität

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

Offensichtlich ist es ein Schmerz zu verwenden, weil es erfordert, dass die Offsets von perfekt guten Tag/Monat Paare zu berechnen. Das heißt, Sie sollten in der Lage sein BC-Daten zu erstellen, indem Sie das Jahr mit einem '-' (Minuszeichen) unterschreiben.

Dann würden Sie Ausgabe das Datum mit

DateTime::format("c") 

In der Produktion dieses etwas aussehen würde:

$date= new DateTime(); 

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

echo $date->format("c"); 
Verwandte Themen