2016-04-29 6 views
0

libical scheint nur den Olsen-Stadtnamen zu akzeptieren, um Zeitzonen in seiner Datenbank nachzuschlagen. Was ich habe, das ist tragbar ist eine Struktur tm, die einen GMT-Offset und die Kurzschrift 3-4 Buchstaben-Code (EST/EDT usw.) hat, aber es gibt keine Funktion, die das in libical akzeptiert.Gibt es einen portablen Weg, um die lokale Systemzeitzone in einen libischen icaltimetype zu bringen?

Ich habe eine wirklich miese Art und Weise, wo ich scannen die tz-Liste von libical versucht, die tznames, und das wird wahrscheinlich funktionieren, aber ich bin mir bewusst, das ist eine schlechte Idee. Aber ich habe keine andere Möglichkeit gefunden, die lokale Zeitzone in einen libicalischen Zeittyp zu bringen.

Fehle ich etwas einfaches?

Und durch portable meine ich Windows, OSX und Linux.

Dies ist ein c-Programm, das ich schreibe. Aber ich sehe jetzt, dass tz Offset ist nicht posix, so dass das nicht tun wird.

+0

Sie wirklich nicht auf Abkürzung übereinstimmen möchten. Man beachte, dass "CST" 5 verschiedene Bedeutungen hat, "IST" hat 3 verschiedene Bedeutungen usw. Außerdem solltest du deine Frage mit einer Sprache versehen ([Tag: C], nehme ich an). Und es ist unklar, welche Eingaben Sie tatsächlich haben, denn [struct 'tm'] (http://www.cplusplus.com/reference/ctime/tm/) hat keinen Offset von GMT. Bitte klären Sie. –

+1

meins tut: https://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html Aber du hast recht, das ist nicht plattformunabhängig. – stu

+0

Ich wusste, dass es eine schlechte Idee war, auf Abkürzungen zu schreiben, aber ich wollte etwas zum Testen ausprobieren, also ging ich vorerst mit. Deshalb stelle ich diese Frage. – stu

Antwort

0

Also ich denke die Antwort ist, dass es keine Antwort gibt. Nichts tragbares sowieso.

So habe ich separaten Build-Pfade für Linux und OS X, und ich habe nicht zu Fenster bekommen noch ..

Die Linux-Implementierung liest nur von/etc/Zeitzone (mehr dazu auf How do I find the current system timezone?)

und die Osx-Implementierung tut das.

CFTimeZoneRef tzlocal = CFTimeZoneCopyDefault(); 
CFStringRef me = CFTimeZoneGetName(tzlocal); 
NSString *local = (__bridge NSString *)me; 
const char *tzname = [local cStringUsingEncoding:NSUTF8StringEncoding]; 
log.debug("Looking up timezone for %s", tzname); 
// this is a built-in timezone so we don't have to free it. 
local_timezone = icaltimezone_get_builtin_timezone(tzname); 

Nicht tragbar, aber zumindest ist es korrekt.