Ich fand keinen trivialen Weg, um den Zeitversatz in Minuten zwischen der Ortszeit und der UTC-Zeit zu erhalten.C-Code, um lokale Zeitverschiebung in Minuten relativ zur UTC zu erhalten?
Zuerst wollte ich tzset()
verwenden, aber es bietet nicht die Sommerzeit. Gemäß der man-Seite ist es einfach eine ganzzahlige Zahl ungleich Null, wenn die Tageslichtsicherung wirksam ist. Während es normalerweise eine Stunde dauert, kann es in einem Land eine halbe Stunde dauern.
Ich würde es vorziehen zu vermeiden, den Zeitunterschied zwischen aktuellen UTC von gmtime()
und localtime()
zurückgegebenen berechnen.
Eine allgemeinere Lösung würde mir diese Informationen für eine bestimmte Position und einen positiven time_t-Wert oder zumindest lokal geben.
Edit 1: Der Anwendungsfall ist, den richtigen lokalen Zeitversatz für https://github.com/chmike/timez zu erhalten. BTW, Wenn Sie dachten, libc Funktionen zur Manipulation der Zeit waren OK, lesen Sie diese https://rachelbythebay.com/w/2013/03/17/time/.
Edit 2: die beste und einfachste Lösung, die ich bisher habe, die Zeit zu UTC in Minuten Offset zu berechnen ist
// Bogus: assumes DST is always one hour
tzset();
int offset = (int)(-timezone/60 + (daylight ? 60 : 0));
Das Problem ist, die reale Tageslicht Sparzeit zu bestimmen.
Bearbeiten 3: Inspiriert von der Antwort von @trenki, kam ich mit der folgenden Lösung. Dies ist ein Hack darin, dass es mktime()
tricks, die Ausgabe von gmtime()
als die lokale Zeit zu betrachten. Das Ergebnis ist ungenau, wenn die Änderung der Sommerzeit in der Zeitspanne zwischen UTC-Zeit und Ortszeit liegt.
#include <stdio.h>
#include <time.h>
int main()
{
time_t rawtime = time(NULL);
struct tm *ptm = gmtime(&rawtime);
// Request that mktime() looksup dst in timezone database
ptm->tm_isdst = -1;
time_t gmt = mktime(ptm);
double offset = difftime(rawtime, gmt)/60;
printf("%f\n", offset);
return 0;
}
Warum brauchen Sie das? Erklären Sie viel mehr über den Kontext; Warum können Sie 'gmtime' und' localtime' nicht einfach verwenden und einen Unterschied zwischen ihrer 'struct tm' machen? Warum sollte sich Ihr Benutzer um diesen lokalen Zeitversatz kümmern? Und es gibt viele seltsame Fälle (zB Silvester, ...) –
Auch Ihre Frage ist sehr wahrscheinlich Betriebssystem-spezifisch ... AFAIK, [locale (7)] (http://man7.org/linux/ man-pages/man7/locale.7.html) sind nicht im Standard C99, aber in POSIX –
@BasileStarynkevitch Locales sind in C99, selbst C89 hat 'strftime', leider nur mit'% Z' aber nicht '% z'. – Jens