home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1994-05-29 | 18.1 KB | 349 lines |
- DEFINITION MODULE tim;
- __DEF_SWITCHES__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
- (****************************************************************************)
- (* Funktionen, die Datumsausdruecke verarbeiten. *)
- (* *)
- (* Die Funktionen dieses Moduls sind nicht reentrant und koennen nicht *)
- (* in Signalhandlern verwendet werden. *)
- (* Wenn mit diesen Funktionen Zeiten bearbeitet werden, die in der Periode *)
- (* zwischen Standard- und Sommerzeit bzw. umgekehrt liegen, ist das Ergebnis*)
- (* implementierungsabhaengig. *)
- (* -------------------------------------------------------------------------*)
- (* 29-Mai-94, Holger Kleinschmidt *)
- (****************************************************************************)
-
- FROM types IMPORT
- (* TYPE *) int, long, double, sizeT, timeT, StrPtr;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- (* Bei POSIX wird zwischen der UTC (Coordinated Universal Time)-Zeit
- (fruehere GMT-Zeit plus automatische Korrekturen) und der lokalen Zeit
- unterschieden, die sich aus der Zeitzonendifferenz zu GMT und der evtl.
- auftretenden Sommerzeit ergibt.
-
- Lokale Zeiten werden nie in Ausdruecken des Typs 'timeT' repraesentiert,
- sondern immer in Ausdruecken des Typs 'TmRec', der eine Zeitangabe in
- aufgeschluesselter Form enthaelt. Eine Zeit, die in einem Ausdruck des
- Typs 'timeT' kodiert ist, ist immer eine Zeit in Sekunden seit
- dem 1.1.1970 00:00:00 Uhr UTC bzw. GMT (dieser Zeitpunkt wird auch
- die ``Epoche'' genannt),
-
- Eine Ausdruck des Typs 'TmRec' kann jedoch sowohl eine lokale als auch
- eine UTC-Zeit enthalten.
-
- Also:
-
- 'timeT': Sekunden seit dem 1.1.1970 00:00:00 UTC
- 'TmRec': Aufgeschluesselte lokale oder UTC-Zeit
-
-
- Die Information, wie aus der lokalen Zeit die UTC-Zeit errechnet werden
- kann (und umgekehrt), wird der Environmentvariablen TZ entnommen. Sie
- enthaelt Namen der Zeitzonen, die zeitlichen Differenzen zur UTC-Zone
- und Angaben ueber die Sommerzeit.
-
-
- Format der Environmentvariable TZ:
- ----------------------------------
-
- Beginnt mit Doppelpunkt: TZ=:<imp. def.> systemspezifisches Format
-
- Sonst: <std><offset1>[<dst>[<offset2>][,<rule>]]
-
- <std>: Drei oder mehr Zeichen, die weder Ziffern, Pluszeichen, Minuszeichen
- oder Komma sind. Das erste Zeichen darf kein Doppelpunkt sein.
- Name der Zeitzone ohne Sommerzeit.
-
- <dst>: Wie oben, aber optional. Name der Zeitzone mit Sommerzeit.
-
- <offset1>: <hh>[:<mm>[:<ss>]]
- Zeit, die zur lokalen Zeit addiert werden muss, um UTC-Zeit zu erhalten.
-
- <hh>: Ein oder mehr Ziffern, optional mit fuehrendem Minuszeichen
- (Zeitzone oestlich von UTC) oder Pluszeichen (Zeitzone westlich
- von UTC). [0..24].
-
- <mm>: Ein oder mehr Ziffern, aber optional, dann gleich Null. [0..59].
-
- <ss>: Ein oder mehr Ziffern, aber optional, dann gleich Null. [0..59].
-
-
- <offset2>: wie <offset1>, aber optional, dann eine Stunde weniger als
- <offset1>
-
- <rule>: <start>[/<time>],end[/<time>] Beginn und Ende der Sommerzeit
-
- <start>: Datum des Starts der Sommerzeit
-
- | M<m>.<n>.<d>
- (n-ter d-Tag im Monat m)
- <m>: Nummer des Monats [1..12]
- <n>: Woche im Monat [1..5].
- 1 <=> Erste (unvollstaendige) Woche mit einem <d>-Tag im
- im Monat <m>.
- 5 <=> Letzte (unvollstaendige) Woche mit einem <d>-Tag im
- Monat <m>; kann, je nach Monat, die vierte oder fuenfte
- Woche sein.
- <d>: Tag der Woche [0..6], 0 <=> Sonntag
-
-
- | J<n>: Julianischer Tag [1..365] im Jahr, es gibt KEINEN 29.2!
-
- | <n>: Julianischer Tag [0..365] im Jahr, es gibt einen 29.2
-
- <time>: Format wie <offset>, aber ohne Vorzeichen. Lokale Zeit der
- Umstellung, optional, dann = 2:00:00 Uhr
-
- (Der Zeitpunkt der Umstellung von der Sommerzeit zurueck zur
- ``normalen'' Zeit (Standardzeit) wird in der Sommerzeit
- angegeben, d.h. die Umstellung findet dann z.B. um 2:00
- Sommerzeit bzw. 1:00 normaler Zeit statt.)
-
- <end>: wie <start>
-
-
- Falls TZ nicht gesetzt ist, werden systemspezifische Defaults verwendet.
- Falls TZ gesetzt aber leer ist, wird die UTC-Zeitzone angenommen.
-
- Eine fuer Deutschland gueltige Beschreibung waere:
-
- TZ=MET-1:00:00MEST-2:00:00,M3.5.0/2:00:00,M9.5.0/3:00:00
-
- (Sommerzeit vom letzten Sonntag im Maerz bis zum letzten Sonntag
- im September, Umschaltung jeweils zwei Uhr lokaler Standardzeit.)
-
- Das gleiche unter Ausnutzung von Defaultwerten:
-
- TZ=MET-1MEST,M3.5.0,M9.5.0/3
-
- ==========================================================================
-
- GEMDOS/MiNT:
- Ausdruecke des Typs 'timeT' enthalten eine lokale Zeit. Solange aber nur
- die Funktionen dieses Moduls zur Dekodierung herangezogen werden, entsteht
- kein Problem. Als Folge davon muss eine Zeitzonenanpassung zwischen
- lokaler und UTC-Zeit ausschliesslich bei "gmtime()" vorgenommen werden,
- nicht jedoch bei den anderen Funktionen.
- *)
-
- TYPE
- TmRec = RECORD
- tmSec : int; (* Sekunden [0..61] (+ 2 Schaltsekunden) *)
- tmMin : int; (* Minuten [0..59] *)
- tmHour : int; (* Stunden [0..23] *)
- tmMDay : int; (* Tag im Monat [1..31] *)
- tmMon : int; (* Monat [0..11] *)
- tmYear : int; (* Jahre seit 1900 [0..) *)
- tmWDay : int; (* Wochentag [0..6], 0 = Sonntag *)
- tmYDay : int; (* Tag im Jahr [0..365], 1.Jan. = 0 *)
- tmIsDst : int; (* >0: im Augenblick gilt Sommerzeit,
- =0: im Augenblick gilt keine Sommerzeit,
- <0: keine Information ueber Sommerzeit vorhanden *)
- (* Nicht POSIX: *)
- tmGmtOff : long;(* Sekundendifferenz zwischen UTC und momentan
- gueltiger Zeitzone *)
- tmZone : StrPtr; (* Name der momentan gueltigen Zeitzone *)
- END;
-
- TmPtr = POINTER TO TmRec;
-
- VAR
- (* tzname^[0]: Name der Zeitzone ohne Sommerzeit,
- * tzname^[1]: Name der Zeitzone mit Sommerzeit
- *)
- tzname : ARRAY [0..1] OF StrPtr;
-
- VAR (* Nicht POSIX: *)
- timezone : long;
- (* Sekunden Differenz zwischen GMT (UTC) und lokaler Standardzeit,
- positiv wenn westlich von GMT *)
- altzone : long;
- (* Sekunden Differenz zwischen GMT (UTC) und lokaler Sommerzeit
- positiv wenn westlich von GMT *)
- daylight : BOOLEAN;
- (* Existiert eine Zeitzone mit Sommerzeit ? Sagt nicht aus, ob die
- Sommerzeit im Augenblick gueltig ist. *)
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- (* Nicht POSIX: *)
- PROCEDURE difftime ((* EIN/ -- *) time2 : timeT;
- (* EIN/ -- *) time1 : timeT ): double;
-
- (*--------------------------------------------------------------------------
- | Liefert die Differenz von <time2> und <time1> in Sekunden. |
- --------------------------------------------------------------------------*)
-
-
-
- PROCEDURE tzset;
-
- (*--------------------------------------------------------------------------
- | Setzt den Inhalt von 'tzname', 'timezone', 'altzone' und 'daylight' aus |
- | der Environmentvariablen TZ. |
- | Die Prozedur wird automatisch von "ctime()", "localtime()", "strftime()" |
- | und "mktime()" aufgerufen. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE localtime ((* EIN/ -- *) tm : timeT ): TmPtr;
-
- (*--------------------------------------------------------------------------
- | <tm> ist eine Zeit in Sekunden seit der ``Epoche''.Als Funktionswert wird|
- | ein Zeiger auf eine interne Struktur vom Type 'TmRec' geliefert, in der |
- | die einzelnen Felder mit der lokalen Zeit belegt sind. Die Informationen |
- | hierzu werden der Environmentvariablen TZ entnommen; existiert diese |
- | nicht, werden systemspezifische Defaultwerte benutzt. |
- | Die interne Struktur wird mit jedem Aufruf von "localtime()" oder |
- | "gmtime()" ueberschrieben. |
- | |
- | GEMDOS/MiNT: Es findet keine Zeitzonenanpassung statt, da <tm> eine |
- | lokale Zeit repraesentiert. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE gmtime ((* EIN/ -- *) tm : timeT ): TmPtr;
-
- (*--------------------------------------------------------------------------
- | Wie "localtime()", aber die Felder sind mit der UTC-Zeit belegt, es |
- | findet also keine zeitliche Anpassung zwischen 'tm' und dem Ergebnis |
- | statt (TZ wird dann auch nicht benutzt). |
- | |
- | GEMDOS/MiNT: Es findet eine Zeitzonenanpassung mithilfe von TZ statt, |
- | da <tm> eine lokale Zeit repraesentiert. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE asctime ((* EIN/ -- *) tmrec : TmPtr ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Es wird ein Zeiger auf einen String zurueckgeliefert, der eine Reprae- |
- | sentation des Datums <tmrec> in englischer Sprache enthaelt. Das Format |
- | ist: |
- | |
- | "Fri Apr 30 12:32:01 1994". |
- | |
- | Genauer gesagt wird das folgende ``C''-printf-Format verwendet: |
- | |
- | "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n" |
- | |
- | D.h. die Stunden, Minuten und Sekunden werden mit mindestens zwei Ziffern|
- | (evtl. fuehrende Null) ausgegeben, es koennen aber auch mehr sein (wenn |
- | die Werte in <tmrec> nicht im angegebenen Bereich liegen). |
- | Der String enthaelt als letztes Zeichen ein Linefeed (12C) und liegt in |
- | einem statischen Speicherbereich, der beim naechsten Aufruf der Prozedur |
- | ueberschrieben wird. |
- | |
- | GEMDOS/MiNT: Keine Besonderheiten. |
- --------------------------------------------------------------------------*)
-
- PROCEDURE ctime ((* EIN/ -- *) tm : timeT ): StrPtr;
-
- (*--------------------------------------------------------------------------
- | Aequivalent zu: asctime(localtime(<tm>)). |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE mktime ((* EIN/ -- *) tmrec : TmPtr ): timeT;
-
- (*--------------------------------------------------------------------------
- | Produziert aus der lokalen Zeit in <tmrec>^ eine UTC-Zeit, und ist damit |
- | die Umkehrung zu "localtime()". |
- | Falls die Environmentvariable TZ nicht existiert, werden systemspezifi- |
- | sche Defaultwerte fuer die zeitliche Anpassung benutzt. |
- | Falls <tmrec>^ in einzelnen Feldern Werte ausserhalb der Bereichsgrenzen |
- | enthaelt, wird versucht, diese zu korrigieren, indem die Werte der |
- | anderen Felder entsprechend angepasst werden. Dies gilt fuer die Felder |
- | 'tmSec', 'tmMin', 'tmHour', 'tmMDay', 'tmMon' und 'tmYear'; die rest- |
- | lichen Felder werden immer neu gesetzt. |
- | |
- | GEMDOS/MiNT: Es findet keine Zeitzonenanpassung statt, da als Funktions- |
- | ergebnis eine lokale Zeit geliefert wird. |
- --------------------------------------------------------------------------*)
-
-
- PROCEDURE strftime ((* EIN/ -- *) buf : StrPtr;
- (* EIN/ -- *) maxsize : sizeT;
- (* EIN/ -- *) format : StrPtr;
- (* EIN/ -- *) tmrec : TmPtr ): sizeT;
-
- (*--------------------------------------------------------------------------
- | Wandelt die Zeit <tmrec>^ in einen String um. Der String wird nach <buf>^|
- | geschrieben, <maxsize> ist der Platz in <buf>^ einschliesslich Nullbyte. |
- | Als Funktionswert wird die Laenge des Strings geliefert, falls der Platz |
- | ausgereicht hat, sonst wird Null geliefert, und der Inhalt von <buf>^ ist|
- | undefiniert. Mit <format>^ wird festgelegt, wie der erzeugte String aus- |
- | sehen soll, wobei Formatanweisungen aehnlich dem ``C''-printf verwendet |
- | werden: |
- | Nicht POSIX: Falls <buf> gleich NULL ist, wird nichts geschrieben, aber |
- | die Laenge des sonst erzeugten Strings zurueckgeliefert (wenn <maxsize> |
- | gross genug war). |
- | |
- | Das Zeichen '%' leitet eine Formatanweisung ein, die durch genau ein |
- | weiteres Zeichen festgelegt wird; jede Formatanweisung wird durch die |
- | angegebene Zeichenkette ersetzt. Es gibt die folgenden Anweisungen: |
- | |
- | %a Lokale Repraesentation des abgekuerzten Wochentags |
- | %A Lokale Repraesentation des vollen Wochentags |
- | %b Lokale Repraesentation des abgekuerzten Monats |
- | %B Lokale Repraesentation des vollen Monats |
- | %c Lokale Datums- und Zeitrepraesentation |
- | %d Tag des Monats als zweistellige Dezimalzahl im Bereich 01-31 |
- | %H Stunde als zweistellige Dezimalzahl im Bereich 00-23 |
- | %I wie %H, aber im Bereich 01-12 |
- | %j Tag des Jahres als dreistellige Dezimalzahl im Bereich 001-366 |
- | %m Monat als zweistellige Dezimalzahl im Bereich 01-12 |
- | %M Minute als zweistellige Dezimalzahl im Bereich 00-59 |
- | %p Lokales Aequivalent zu A.M. bzw. P.M. (leer, falls nur 24h-Uhr) |
- | %S Sekunde als zweistellige Dezimalzahl im Bereich 00-59 |
- | %U Woche des Jahres als zweistellige Dezimalzahl im Bereich 00-53. |
- | Woche 01 ist die erste (vollstaendige) Woche im angegebenen Jahr, die|
- | mit einem Sonntag beginnt, Woche 00 enthaelt die Tage der unvoll- |
- | staendigen Woche davor. |
- | %w Wochentag als einstellige Dezimalzahl im Bereich 0-6, Sonntag = 0 |
- | %W Woche des Jahres als zweistellige Dezimalzahl im Bereich 00-53. |
- | Woche 01 ist die erste (vollstaendige) Woche im angegebenen Jahr, die|
- | mit einem Montag beginnt, Woche 00 enthaelt die Tage der unvoll- |
- | staendigen Woche davor. |
- | %x Lokale Datumsrepraesentation |
- | %X Lokale Zeitrepraesentation |
- | %y Jahr als zweistellige Dezimalzahl im Bereich 00-99 |
- | %Y Jahr inkl. Jahrhundertziffern |
- | %Z Name der Zeitzone, falls bekannt, sonst leer |
- | %% Ein %-Zeichen |
- | |
- | Die folgenden Formatanweisungen werden nicht von POSIX.1 unterstuetzt, |
- | aber vom POSIX.2-Programm 'date': |
- | |
- | %C Jahrhundert als zweistellige Dezimalzahl |
- | %D wie %m/%d/%y |
- | %e wie %d, aber mit Leerzeichen statt fuehrender Null |
- | %h wie %b |
- | %n Linefeed |
- | %r wie %I:%M:%S %p |
- | %T wie %H:%M:%S |
- | %t Tabulator |
- | |
- | Die folgenden Formatanweisungen werden nicht von POSIX unterstuetzt: |
- | |
- | %k wie %H, aber mit Leerzeichen statt fuehrender Null |
- | %l wie %I, aber mit Leerzeichen statt fuehrender Null |
- | %R wie %H:%M |
- | |
- | Alle Zeichen ausser '%' werden unveraendert von <format> nach <buf>^ |
- | uebertragen. |
- | |
- | GEMDOS/MiNT: Es wird nur das ``C/POSIX-Locale'' verwendet. |
- --------------------------------------------------------------------------*)
-
- END tim.
-