Unixzeit

Unixzeit

Die Unixzeit ist eine einfache Zeitdefinition, die 1969 für das Betriebssystem Unix entwickelt und als POSIX-Standard festgelegt wurde. Vor Unix Version 6 zählte die Unix-Uhr in Hundertstel Sekunden, daher musste die Epoche jedes Jahr neu festgelegt werden. Seit Unix Version 6 zählt die Unixzeit die vergangenen Sekunden seit dem 1. Januar 1970 00:00 Uhr UTC, wobei Schaltsekunden nicht mitgezählt werden. Dieses Startdatum wird auch als The Epoch (siehe Epoche) bezeichnet.

Inhaltsverzeichnis

Eigenschaften

Umrechnung

Die Umrechnung in eine menschenlesbare Form sowie die Anwendung von Zeitzonen, Sommerzeit und Schaltjahren werden dann von zusätzlichen Funktionen der Standardbibliothek übernommen. Die Darstellung des Datums als Sekunden seit der Unix-Epoche wird häufig verwendet, weil sie für Computerprogramme viel leichter zu verarbeiten ist als das „menschliche“ Datumsformat. Außerdem lassen sich mit diesen Werten leicht Zeiträume berechnen, indem man einfach den einen Wert vom anderen abzieht. Umstellung auf Sommer- oder Winterzeit spielen dann keine Rolle mehr. Aus diesem Grund wird dieser Wert auch gerne als Zeitstempel verwendet. In vielen modernen Server-Anwendungen spielt der Zeitstempel aufgrund dieser Vorteile weiterhin eine tragende Rolle, so etwa im Umfeld von PHP- oder MySQL-Applikationen bei der Unterscheidung und Generierung zeitbezogener Datenbank-Einträge. Die vordefinierten PHP-Funktionen date() und mktime() ermöglichen hier beispielsweise durch das Einsetzen passender Funktionsargumente die einfache Konvertierung eines Zeitstempels in ein menschenlesbares Datumsformat und umgekehrt.

Jahr-2038-Problem

Viele, aber bei weitem nicht alle Systeme, welche die Unixzeit verwenden, speichern und verarbeiten die Zeitangabe als vorzeichenbehaftete 32-Bit-Zahl (Integer). Somit umfasst der Sekundenraum die Werte −2.147.483.648 bis +2.147.483.647. Umgerechnet in Jahre entspricht dies etwas mehr als −68 bis +68.

Am 19. Januar 2038 um 3:14:08 Uhr UTC wird es daher bei Computersystemen, welche die Unixzeit in einer vorzeichenbehafteten 32-Bit-Variable speichern, zu einem Überlauf kommen. Die darzustellende Zeit wird dann mit der 2.147.483.648sten Sekunde nicht mehr in der Variable gespeichert werden können, womit es dann zum Jahr-2038-Problem kommen würde.

Unixzeiten vor dem 13. Dezember 1901 20:45:52 UTC sind mit einer vorzeichenbehafteten 32-Bit-Zahl auch nicht darstellbar, da die Zeitstempel kleiner als −2.147.483.648 wären.

Moderne Unix-Systeme verwenden zumindest in ihrer 64-Bit-Variante eine vorzeichenbehaftete 64-Bit-Zahl, was keine nennenswerte Beschränkung des Wertebereichs bewirkt.

Trotz der allgemeinen Tendenz zu 64-Bit Systemen sind eingebettete Systeme auf Unix-Basis zurzeit noch nahezu ausschließlich 32-Bit Systeme. Die in letzter Zeit erkennbare Tendenz, Haushaltsgeräte (z.B. Router, Radiowecker und Ähnliches) durch eingebettete Systeme auf Unix-Basis zu implementieren, birgt daher das Risiko, dass diese Geräte ab dem 19. Januar 2038 nicht mehr korrekt funktionieren.

Schaltsekunde

Zeitangaben in Unixzeit sind nicht immer ganz so problemlos, wie es auf den ersten Blick erscheint. Das hat die Unixzeit durchaus mit anderen Zeitangaben gemeinsam, da unser übliches Zeitsystem, das auf der Annäherung an astronomische/physikalische Gegebenheiten beruht, ebenfalls gelegentlich gewechselt wurde. Zudem verschiebt sich die Definition der Sekunde als Teil des Tages gegenüber der physikalischen Definition, da die Erdrotation aufgrund von Gezeitenkräften durch den Mond immer langsamer wird (siehe auch Schaltsekunde). The Epoch der Unixzeit ist heute beispielsweise als 1. Januar 1970 00:00 Uhr UTC definiert. Jedoch gab es zu dieser Zeit das heutige UTC-System noch gar nicht, es wurde in der jetzigen Form erst 1972 eingeführt. Der Zeitpunkt der Epoche ist eigentlich der 1. Januar 1970 00:00 Uhr GMT. Zu diesem Zeitpunkt sind zurückgerechnete UTC-Zeit und GMT-Zeit zufällig identisch. Jedoch stimmen UTC-Unixzeiten vor dem 1. Januar 1972 aufgrund unterschiedlicher Schaltsekunden in UTC und GMT nicht immer exakt mit den damals gebrauchten GMT-Zeitangaben überein. Unixzeit eignet sich daher nicht für die sekundengenaue Zeitdarstellung jeder beliebigen Zeit vor dem 1. Januar 1972.

In den letzten Jahren gab es mehrere Versuche im Rahmen der POSIX-Standardisierung eine Darstellung der Schaltsekunde zur POSIX-UNIX-Zeitdefinition hinzuzufügen. Die Diskussionen zu diesem Thema führten jedoch bislang nicht zu einem allgemein akzeptierten Ergebnis. Viele UNIX-Systeme implementieren aber neben der UNIX-Zeit, die meist der gesetzlichen Zeit nachgeführt wird, zusätzlich eine hochaufgelöste Zeit, die monoton seit dem letzten Reboot zählt und daher für hochgenaue Zeitdifferenz-Messungen geeignet ist.

Vergleich

Die Unixzeit hat sich im Computerbereich vor allem durch die weite Verwendung für Zeitstempel durchgesetzt, da die Zeitdifferenz zwischen zwei Ereignissen eine Subtraktion zweier Integer-Werte ist. Dies kann durch moderne Rechenwerke in einem Takt erfolgen. Dies ist sinnvoll für Hochdurchsatz bei Spezialanwendungen wie Kommunikationselementen (Internet) und Dateiservern (auch Datenbanken). Tatsächlich basieren viele der handelsüblichen Netzwerkgeräte intern auf einem angepassten Unixsystem.

Für die menschliche Anwendung sinnvoller sind oft die gebrochenen Zeiten, bei der die übliche UTC-Zeit in sechs Zahlen für Jahr, Monat, Tag, Stunde, Minute, Sekunde ausgedrückt wird. Auch Unix kennt eine Konvertierung der Unixzeit in eine gebrochene Darstellung mittels localtime(). In den DOS-Systemen war die gebrochene Zeit dagegen das Standardformat, und wird auf FAT-Dateisystemen für Zeitstempel der Dateien in einer kompakten Darstellung gespeichert. Die gebrochene Darstellung macht jedoch Berechnungen aufwändig.

In modernen Systemen setzt sich zunehmend durch, die Zeitstempel als Gleitkommazahl zu speichern, da moderne CPUs oft Rechenwerke besitzen, die auch die aufwändigere Arithmetik dieser Zahlen in einem Takt bewältigen. Die Gleitkommazahlen können auch sehr weit entfernte Zeitangaben speichern, teils Millionen Jahre entfernt, dann aber unter verminderter Zeitgenauigkeit. Eine sekundengenaue Angabe erfolgt nur nahe der Basiszeit (Epoche), die der Gleitkomma-Null entspricht.

Siehe auch: Julianisches Datum

Besondere Werte

Das Unix-Millennium wurde am 9. September 2001 in Kopenhagen auf einer Party der dänischen UNIX User Group um 03:46:40 Ortszeit gefeiert

Unix-Enthusiasten haben es zum Brauch gemacht, zu bestimmten Werten der Unixzeit so genannte time_t parties – ähnliche den Neujahrsfeiern zum Jahreswechsel – zu veranstalten. Üblicherweise werden runde Dezimal-Werte, wie 1.000.000.000 oder 2.000.000.000 gefeiert. Unter manchen Benutzern werden allerdings auch runde Binär-Werte gefeiert, beispielsweise +230 (1.073.741.824), welcher auf den 10. Januar 2004 13:37:04 UTC fiel. Am 13. Februar 2009 um 23:31:30 UTC (14. Februar 2009 um 00:31:30 CET) schaltete der Suchmaschinenbetreiber Google ein spezielles Doodle, da die Unixzeit in diesem Moment den Wert 1234567890 erreichte.[1] Auch der Heise Newsticker widmete diesem Wert einen Artikel.[2]

Durch die Einführung von Schaltsekunden sind diese Werte allerdings nicht korrekt. Dennoch werden diese Zeitpunkte üblicherweise als „n Sekunden seit der Unix-Epoche“ gefeiert.

Wert hexadezimal Zeitpunkt (UTC)
-11644473600 1. Januar 1601 00:00:00
0 00 00 00 00 1. Januar 1970 00:00:00
216 = 0000065536 00 01 00 00 1. Januar 1970   18:12:16
224 = 0016777216 01 00 00 00 14. Juli 1970   04:20:16
100000000 05 F5 E1 00 3. März 1973   09:46:40
228 = 0268435456 10 00 00 00 4. Juli 1978   21:24:16
500000000 1D CD 65 00 5. November 1985   00:53:20
229 = 0536870912 20 00 00 00 5. Januar 1987   18:48:32
805306368 30 00 00 00 9. Juli 1995   16:12:48
1000000000 3B 9A CA 00 9. September 2001   01:46:40
230 = 1073741824 40 00 00 00 10. Januar 2004   13:37:04
1111111111 42 3A 35 C7 18. März 2005   01:58:31
1234567890 49 96 02 D2 13. Februar 2009   23:31:30
1300000000 4D 7C 6D 00 13. März 2011   07:06:40
1342177280 50 00 00 00 13. Juli 2012   11:01:20
1500000000 59 68 2F 00 14. Juli 2017   02:40:00
1610612736 60 00 00 00 14. Januar 2021   08:25:36
1879048192 70 00 00 00 18. Juli 2029   05:49:52
2000000000 77 35 94 00 18. Mai 2033   03:33:20
231 -1 = 2147483647 7F FF FF FF 19. Januar 2038   03:14:07
2222222222 84 74 6B 8E 2. Juni 2040   03:57:02
3000000000 B2 D0 5E 00 24. Januar 2065   05:20:00
3735928559 DE AD BE EF 20. Mai 2088   23:55:59
4000000000 EE 6B 28 00 2. Oktober 2096   07:06:40
232 -1 = 4294967295 FF FF FF FF 7. Februar 2106   06:28:15

Der 1. Januar 1601 ist der Beginn der Microsoft-Zeitrechnung, die in Schritten von 100 ns erfolgt.

Unix-Befehle

Bei einigen Unix-ähnlichen Systemen lässt sich mittels nachstehendem Befehl Unixzeit in die äquivalente UTC-Zeit umrechnen (das Verhalten von date aus dem Beispiel ist nicht Bestandteil des POSIX-Standards).

 date -u -d @UNIXTIME

Beispiel:

 date -u -d @1234567890
 Fr 13. Feb 23:31:30 UTC 2009

Umgekehrt lässt sich die aktuelle Anzahl der vergangenen Sekunden seit dem 1. Januar 1970 auf einigen Unix-/Linux-Systemen mittels date +%s anzeigen (das Verhalten von date ist auch hier nicht Bestandteil des POSIX-Standards).

Beispiel-Implementierung

Möchte man die Unixzeit zu einem gegebenen Zeitpunkt berechnen, lässt sich das über folgenden Rechenweg bewerkstelligen. Die Unixzeit kennt keine Zeitzonen und nutzt als Eingabe eine von Zeitzonen bereinigte Zeit.

Achtung: Der folgende Quelltext ist in C/C++ verfasst, und arbeitet daher mit maschinenabhängigen Genauigkeiten. Bei 32-Bit-Maschinen kann also vom Auftreten des Jahr-2038-Problems ausgegangen werden. Wie jeder Beispielquelltext dient er allein der Illustration und sollte ohne gründliche Tests nicht in den produktiven Einsatz übernommen werden.

/** Konvertiert gegliederte UTC-Angaben in Unix-Zeit.
 * Parameter und ihre Werte-Bereiche:
 * - jahr [1970..2038]
 * - monat [1..12]
 * - tag [1..31]
 * - stunde [0..23]
 * - minute [0..59]
 * - sekunde [0..59]
 */
long unixzeit(int jahr, int monat, int tag, 
              int stunde, int minute, int sekunde)
{
  const short tage_bis_monatsanfang[12] = /* ohne Schalttag */
    {0,31,59,90,120,151,181,212,243,273,304,334};
 
  long unix_zeit;
  long jahre=jahr-1970;
  int schaltjahre=((jahr-1)-1968)/4 - ((jahr-1)-1900)/100 + ((jahr-1)-1600)/400;
 
  unix_zeit=sekunde + 60*minute + 60*60*stunde +
    (tage_bis_monatsanfang[monat-1]+tag-1)*60*60*24 +
    (jahre*365+schaltjahre)*60*60*24;
 
  if ( (monat>2) && (jahr%4==0 && (jahr%100!=0 || jahr%400==0)) )
    unix_zeit+=60*60*24; /* +Schalttag wenn jahr Schaltjahr ist */
 
  return unix_zeit;
}

Einzelnachweise

  1. Doodle zur Unixzeit 1234567890
  2. http://www.heise.de/newsticker/meldung/1234567890-194566.html

Weblinks


Wikimedia Foundation.

Игры ⚽ Нужно сделать НИР?

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Unix-Epoche — Die Unixzeit ist eine einfache Zeitdefinition, die 1969 für das Betriebssystem Unix entwickelt und als POSIX Standard festgelegt wurde. In den ersten Tagen von Unix wurde die Definition mehrfach geändert. Seit mehreren Jahrzehnten ist sie jedoch… …   Deutsch Wikipedia

  • Unix-Timestamp — Die Unixzeit ist eine einfache Zeitdefinition, die 1969 für das Betriebssystem Unix entwickelt und als POSIX Standard festgelegt wurde. In den ersten Tagen von Unix wurde die Definition mehrfach geändert. Seit mehreren Jahrzehnten ist sie jedoch… …   Deutsch Wikipedia

  • Unix-Zeit — Die Unixzeit ist eine einfache Zeitdefinition, die 1969 für das Betriebssystem Unix entwickelt und als POSIX Standard festgelegt wurde. In den ersten Tagen von Unix wurde die Definition mehrfach geändert. Seit mehreren Jahrzehnten ist sie jedoch… …   Deutsch Wikipedia

  • Unixtime — Die Unixzeit ist eine einfache Zeitdefinition, die 1969 für das Betriebssystem Unix entwickelt und als POSIX Standard festgelegt wurde. In den ersten Tagen von Unix wurde die Definition mehrfach geändert. Seit mehreren Jahrzehnten ist sie jedoch… …   Deutsch Wikipedia

  • Jahr-2038-Problem — Exemplarische Darstellung des Jahr 2038 Problems Das Jahr 2038 Problem von EDV Systemen könnte zu Softwareausfällen im Jahr 2038 führen. Dieses Problem ist auf EDV Systeme beschränkt, die den POSIX Zeitstandard benutzen und time t als… …   Deutsch Wikipedia

  • 2038 — Exemplarische Darstellung des Jahr 2038 Problems Das Jahr 2038 Problem könnte zu Softwareausfällen im Jahr 2038 führen. Dieses Problem ist auf EDV Systeme beschränkt, die den POSIX Zeitstandard benutzen und time t als 32 Bit Binärzahl definieren …   Deutsch Wikipedia

  • 2038-Problem — Exemplarische Darstellung des Jahr 2038 Problems Das Jahr 2038 Problem könnte zu Softwareausfällen im Jahr 2038 führen. Dieses Problem ist auf EDV Systeme beschränkt, die den POSIX Zeitstandard benutzen und time t als 32 Bit Binärzahl definieren …   Deutsch Wikipedia

  • Chronologisch — Zeitrechnung ist in der Chronologie die zyklische sowie die lineare Strukturierung der Zeit. Die zyklische Zeitrechnung ist Arbeitsgebiet der Kalenderrechnung und der Uhrzeitrechnung. Die lineare Zeitrechnung bezeichnet man als Jahrrechnung.… …   Deutsch Wikipedia

  • Jahrrechnung — Zeitrechnung ist in der Chronologie die zyklische sowie die lineare Strukturierung der Zeit. Die zyklische Zeitrechnung ist Arbeitsgebiet der Kalenderrechnung und der Uhrzeitrechnung. Die lineare Zeitrechnung bezeichnet man als Jahrrechnung.… …   Deutsch Wikipedia

  • Lineare Zeit — Zeitrechnung ist in der Chronologie die zyklische sowie die lineare Strukturierung der Zeit. Die zyklische Zeitrechnung ist Arbeitsgebiet der Kalenderrechnung und der Uhrzeitrechnung. Die lineare Zeitrechnung bezeichnet man als Jahrrechnung.… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”