2015-07-29 8 views
6

Es ist mir aufgefallen, dass mir ein Mechanismus zum Speichern von Daten vor 1970 Jan nicht bekannt ist. 1 als Unix-Zeitstempel. Seit diesem Datum ist die Unix "Epoche" keine große Überraschung.So stellen Sie Daten vor der Epoche als UNIX-Zeitstempel dar

Aber - obwohl es dafür nicht gedacht ist - möchte ich noch Daten in der Vergangenheit im Unix-Format speichern.
Ich brauche das aus Gründen.

Meine Frage ist also: Wie würde man Unix-Zeitstempel mit "ungültigen" aber noch funktionierenden Daten machen? Würde die Speicherung einer negativen Anzahl von Sekunden funktionieren? Können wir sogar negative Mengen von Sekunden in einem Unix-Zeitstempel speichern? Ich meine, ist das nicht unsigniert?

Auch wenn ich richtig liege, könnte ich nur Daten speichern, die so weit zurück wie 1901. dec. 13 20:45:52 sind. Könnte das irgendwie weiter zurück in der Geschichte erweitert werden?

+1

Unix 'time_t' ist ein vorzeichenbehafteter 32-Bit-Int, so dass Sie, wie Sie festgestellt haben, auf 1901 zurückgehen können. Sie sollten Ihr Betriebssystem überprüfen, viele haben 'time_t' auf 64 Bit erweitert, was Ihnen ein paar hundert Milliarden Jahre Spielraum gibt. –

Antwort

9

Unix Time ist Regel eine 32-Bit-Zahl von ganzen Sekunden vom ersten Moment des Jahres 1970 in UTC, der epoch1 January 1970 00:00:00 UTC ist. Das bedeutet eine Reichweite von etwa 136 Jahren mit etwa der Hälfte beiderseits der Epoche. Negative Zahlen sind früher, Null ist die Epoche und positiv sind später. Für eine vorzeichenbehaftete 32-Bit-Ganzzahl reichen die Werte von 1901-12-13 bis 2038-01-19 03:14:07 UTC.

Dies ist nicht in Stein geschrieben. Nun, es ist geschrieben, aber in einer Reihe von verschiedenen Steinen. Ältere sagen 32-Bit, neuere 64-Bit. Einige Spezifikationen sind, dass die Bedeutung "implementation-defined" ist. Einige Unix-Systeme verwenden einen nicht signierten Int, um sich nur über die Epoche hinaus in die Zukunft zu erstrecken, aber die übliche Praxis war eine vorzeichenbehaftete Zahl. Einige verwenden einen Float statt einer ganzen Zahl. Weitere Informationen finden Sie im Wikipedia-Artikel unter Unix Time und this Question.

Also im Grunde macht Ihre Frage keinen Sinn. Sie müssen den Kontext Ihrer Programmiersprache (Standard C, anderes C, Java usw.), Umgebung (POSIX-kompatibel), bestimmter Softwarebibliothek oder Datenbankspeicher oder App kennen.

Vermeiden Count-From-Epoch

diesen Mangel an Spezifität kommt die Tatsache, dass a couple dozen other epochs werden von verschiedenen Software-Systemen verwendet worden, einig sehr beliebt und weit verbreitet. Beispiele umfassen 1. Januar 1601 für NTFS-Dateisystem & COBOL, 1. Januar 1980 für verschiedene FAT-Dateisysteme, 1. Januar 2001 für Apple Cocoa und Januar 0, 1900 für Excel & Lotus 1-2-3 Tabellenkalkulation.

Fügen Sie noch die Tatsache hinzu, dass verschiedene Granularitäten der Zählung verwendet worden sind. Abgesehen von ganzen Sekunden verwenden einige Systeme Millisekunden, Mikrosekunden oder Nanosekunden.

Ich empfehle gegen Tracking-Datum-Zeit als ein Count-from-Epoche. Verwenden Sie stattdessen bestimmte Datentypen, die in Ihrer Programmiersprache oder Datenbank verfügbar sind. Wenn nicht verfügbar oder wenn Daten ausgetauscht werden, folgen Sie dem Standard ISO 8601, der sinnvolle String-Formate für verschiedene Arten von Datum-Uhrzeit-Werten definiert.

  • Datum
    • 2015-07-29
  • Ein Datum-Zeit mit einer von der UTC-Offset (Z "Zulu" für UTC) (Anmerkung padding Null-Offset)
    • 2015-07-29T14:59:08Z
    • 2001-02-13T12:34:56.123+05:30
  • Woche (mit oder ohne Tag der Woche)
    • 2015-W31
    • 2015-W31-3
  • Ordinal Datum (Tag-of-Jahr)
    • 2015-210
  • Intervall
    • "2007-03-01T13:00:00Z/2008-05-11T15:30:00Z"
  • Dauer (Format PnYnMnDTnHnMnS)
    • P3Y6M4DT12H30M5S = "3 Jahre, 6 Monate, 4 Tage, 12 Stunden, 30 Minuten und 5 Sekunden"

Suche StackOverflow.com für viele weitere Fragen und Antworten zu diesen Themen.

+0

Ehrfürchtig, obwohl ich befürchtete, dass es darauf hinauslaufen würde, "implementierungsdefiniert" zu sein. – Wolfer