Antwort: Re: Zeiten in verschiedenen Zeitzonen
Am 31.03.2003 21:40:05 schrieb Jan.Trippler:
On Mon, 31 Mär 2003 at 19:47 (+0200), bb@kisters.de wrote:
moin, ich möchte die für verschiedene Zeitzonenen ausgeben. Für die aktuelle Zeitzone geht es mit :
time_t tl; struct tm *pt;
tl = time((time_t *)0); pt = localtime(&tl);
Wenn ich mit setenv("TZ", "UTC",1) die Umgebungsvariable setze erhalte ich mit obigen 2 Zeilen auch die Zeit für UTC, das gleich gilt für andere Zeitzonen. Mein Problem ist nun das Zurückkehren in die Ursprungszeitzone. Hat jemand da Erfahrungen?
Wie wäre es mit getenv ("TZ"); und einem setenv mit dem gespeicherten Wert? auf den eingesetzten Systemen ist die Variable TZ nicht gesetzt. Wie kann ich diese bestimmen? mit tzset() ; sprintf(tzstd, "%.3s%li%.3s", tzname[0], timezone/3600, tzname[1]);
erhalte ich zum in tzname[] den Wert UTC obwohl meine Systemzeit GMT-1 ist Gruß Bernard
On Die, 01 Apr 2003 at 19:16 (+0200), bb@kisters.de wrote:
Am 31.03.2003 21:40:05 schrieb Jan.Trippler: [Zeitzone sichern]
Wie wäre es mit getenv ("TZ"); und einem setenv mit dem gespeicherten Wert? auf den eingesetzten Systemen ist die Variable TZ nicht gesetzt. Wie kann ich diese bestimmen? mit tzset() ; sprintf(tzstd, "%.3s%li%.3s", tzname[0], timezone/3600, tzname[1]);
erhalte ich zum in tzname[] den Wert UTC obwohl meine Systemzeit GMT-1 ist
Was meinst Du damit? Welche Zeitzoneninfo rückt denn date raus?
Zitat aus *man tzset*:
<schnipp>
If the TZ variable does appear in the environment but its
value is NULL or its value cannot be interpreted using any
of the formats specified below, Coordinated Universal Time
(UTC) is used.
<schnapp>
Ist TZ vielleicht gesetzt, aber leer? Bei mir funktioniert
folgendes (SuSE 8.0):
<schnipp>
jan@k500:~/tmp> cat tz.c
#include
Hallo, On Tue, 01 Apr 2003, Jan Trippler wrote:
On Die, 01 Apr 2003 at 19:16 (+0200), bb@kisters.de wrote:
Am 31.03.2003 21:40:05 schrieb Jan.Trippler: [Zeitzone sichern] tzset() ; sprintf(tzstd, "%.3s%li%.3s", tzname[0], timezone/3600, tzname[1]); Zitat aus *man tzset*: <schnipp> If the TZ variable does appear in the environment but its value is NULL or its value cannot be interpreted using any of the formats specified below, Coordinated Universal Time (UTC) is used. <schnapp>
tzset ist ja sowieso nicht unbedingt das Mittel der Wahl...
Verwenden sollte man dann wohl die ueblichen Funktionen wie localtime,
strftime usw...
Was das "sichern" usw. von TZ angeht:
====
#include
On Mit, 02 Apr 2003 at 01:07 (+0200), David Haller wrote: [...]
Was das "sichern" usw. von TZ angeht:
==== #include
#include int main(int argc, char * argv[]) { char * TZ; char * oldTZ;
/* save old string */ TZ = getenv("TZ"); oldTZ = TZ; printf("%p: '%s'\n%p: '%s'\n", TZ, TZ, oldTZ, oldTZ);
/* set new string */ printf("setenv = %i\n", setenv("TZ", "UTC", 1)); TZ = getenv("TZ"); printf("%p: '%s'\n%p: '%s'\n", TZ, TZ, oldTZ, oldTZ);
/* restore original string */ printf("setenv = %i\n", setenv("TZ", oldTZ, 1)); TZ = getenv("TZ"); printf("%p: '%s'\n%p: '%s'\n", TZ, TZ, oldTZ, oldTZ);
return 0; } ====
Hm, das ist IMHO nicht sauber.
Zur Verdeutlichung nochmal (was ich auch mit dem Zitat aus dem
tzset-Manual meinte):
jan@k500:~> export TZ=
jan@k500:~> date
Mit Apr 2 19:48:44 UTC 2003
jan@k500:~> unset TZ
jan@k500:~> date
Mit Apr 2 21:48:51 CEST 2003
Es ist also nicht egal, ob TZ gesetzt und leer ist oder ob TZ nicht
gesetzt ist. Bei Deinem Programm passiert nun folgendes:
jan@k500:~/tmp> export TZ=
jan@k500:~/tmp> ./tz
0xbffff720: ''
0xbffff720: ''
setenv = 0
0x8049783: 'UTC'
0xbffff720: ''
setenv = 0
0x80497ab: ''
0xbffff720: ''
OK, soweit in Ordnung, der Zustand ist wieder der alte. Aber:
jan@k500:~/tmp> unset TZ
jan@k500:~/tmp> ./tz
(nil): '(null)'
(nil): '(null)'
setenv = 0
0x8049883: 'UTC'
(nil): '(null)'
setenv = 0
0x80498ab: ''
(nil): '(null)'
Jetzt haben wir auf einmal ein TZ und damit nicht mehr den alten
Zustand. BTW: In Solaris z. B. kriegst Du IIRC postwendend einen
segfault, wenn Du einen Null-Pointer in einer Zuweisung benutzt.
Ich habe mal Peters Idee aufgegriffen und Dein Programm ein wenig
erweitert:
<schnipp>
#include
participants (3)
-
bb@kisters.de
-
David Haller
-
Jan.Trippler@t-online.de