[C]Lokale Zeitzone für ctime(3) ändern

Herakles

Profifragensteller
Moin!

Ich möchte gern, dass in einem C-Programm die aktuelle Zeit für - sagen wir New York ausgegeben wird. Machbar sollte sowas mittels der "broken-down time"-Funktionen unterhalb von ctime(3) sein.

Sehr schön zu sehen ist zum Beispiel, wie das System zwischen der UTC und unsere lokalen (aktuell) Sommerzeit unterscheidet. Hier mal ein kleines Beispiel:

Code:
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

int main(void) {
	struct tm actual_time, *Ptime;
	time_t actual_time__s = 0;

	time( &actual_time__s );
	Ptime = gmtime(&actual_time__s);
	memcpy( &actual_time, Ptime, sizeof(struct tm) );
	printf("%d\n",actual_time.tm_hour);
	Ptime = localtime(&actual_time__s);
	memcpy( &actual_time, Ptime, sizeof(struct tm) );
	printf("%d\n",actual_time.tm_hour);

      return 0;
}

Dieser kleine Code wirft die aktuelle Stundenanzahl nach UTC und danach nach MESZ aus:

Code:
7
9

Es ist also gerade "7 Uhr irgendwas" in England und "9 Uhr irgendwas" in Deutschland.

Jetzt möchte ich aber gern die aktuelle Zeit für - na, sagen wir New York haben. Das liegt in der Zeitzone "EST" oder aber im Sommer in "EDT". Dafür gibt es in tzset(3) Funktionalitäten und Felder, die das berücksichtigen und dann dementsprechend die Ausgabe der ctime(3)-Funktionen ändern sollten.

ALLERDINGS: Ich bekomme es nicht hin, die Zeitzone zu ändern. Wenn ich beispielsweise mein Programm vor dem Aufruf von localtime(3) dahingehend ändere, dass ich die Zeitzoneninformationen wie in tzset(3) gewünscht ändere, dann kommt dennoch dasselbe Ergebnis heraus:

Code:
(...)
tzname[0] = "EST";
tzname[1] = "EDT";
Ptime = localtime(&actual_time__s);
(...)

Ich suche seit einer halben Stunde in den manpages und im Internet, bekomme es aber nicht hin.

Kann mir jemand einen Schubs in die richtige Richtung geben?

Viele Grüße und Dank im Voraus!

Herakles
 
eAus der Manpage von tzset:
The tzset() function initializes time conversion information used by the library routine localtime(3). The environment variable TZ specifies how this is done.
Umgebungsvariablen ändert man mit setenv.
Wenn man nicht an den Umgebungsvariablen schrauben will (thread safety), kann man auch selber den offset auf ein time_t adieren, oder eine Bibliothek benutzen, die das macht.
 
Dankesehr, ich berechne es nun händisch. Eine eigene API dafür wäre mir zuviel Aufwand. Für den Moment reicht das so.

Danke!!!
 
Wen's interessiert, so wird's gemacht:

Code:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() {
        time_t testzeit_T = time(0);
        struct tm testzeit_TM;

        setenv("TZ", "EST5EDT", 1);
        tzset();
        testzeit_TM = *localtime(&testzeit_T);
        printf("%d:%d, name: %s:%s\n",testzeit_TM.tm_hour,testzeit_TM.tm_min,tzname[0],tzname[1]);

return 0;
}

Das Ergebnis ist dann:

Code:
17:57, name: EST:EDT

während es hier in Deutschland kurz vor 12 abends ist.

Grüße
Herakles
 
Zurück
Oben