stu
stu

Reputation: 8805

Is there a portable way to get the local system timezone into a libical icaltimetype?

libical seems to only accept the Olsen city name to look up timezones in its database. What I've got that's portable is a struct tm which has a GMT offset and the shorthand 3-4 letter code (EST/EDT etc) but there's no function that accepts that in libical.

I have a really lousy way where I scan the tz list from libical trying to match the tznames, and that will probably work, but I am well aware this is a bad idea. But I haven't found any other way of getting the local timezone into a libical icaltimetype.

Am I missing something simple?

And by portable I mean windows, osx and linux.

This is a c program I'm writing. But I see now that tz offset is not posix, so that won't do.

Upvotes: 0

Views: 331

Answers (1)

stu
stu

Reputation: 8805

So I think the answer is that there is no answer. Nothing portable anyway.

So I have separate build paths for linux and osx, and I haven't gotten to windows yet..

The linux implementation just reads from /etc/timezone (more on that on How do I find the current system timezone?)

and the osx implementation does this.

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);

Not portable but at least it is correct.

Upvotes: 1

Related Questions