在Linux上,我需要找到当前配置的时区作为Olson位置。我希望我的(C或C ++)代码可移植到尽可能多的Linux系统。
例如。我住在伦敦,所以我目前在奥尔森的住所是“欧洲/伦敦”。我对诸如“ BST”,“ EST”之类的时区ID 不 感兴趣。
Debian和Ubuntu都有一个/etc/timezone包含此信息的文件,但是我认为我不能一直依赖那个文件,对吗?Gnome有一个函数oobs_time_config_get_timezone()也可以返回正确的字符串,但是我希望我的代码在没有Gnome的系统上工作。
/etc/timezone
oobs_time_config_get_timezone()
那么,在Linux上将当前配置的时区作为Olson位置的最佳一般方法是什么?
这是很难得到一个可靠的答案。依靠这样的事情/etc/timezone可能是最好的选择。
(如其他答案中所建议的,变量tzname和的tm_zone成员struct tm通常包含GMT/ BST等缩写,而不是问题中要求的Olson时间字符串)。
tzname
tm_zone
struct tm
GMT
BST
/etc/localtime
/usr/share/zoneinfo/Europe/London
但是,上述方法存在一些问题。该/usr/share/zoneinfo目录还包含诸如GMT和的文件GB,因此用户可能会将符号链接配置为指向该目录。
/usr/share/zoneinfo
GB
同样,没有什么可以阻止用户将正确的时区文件复制到那里,而无需创建符号链接。
解决这个问题的一种方法(似乎可以在Debian,RedHat和OpenBSD上使用)是将/ etc / localtime文件的内容与/ usr / share / zoneinfo下的文件进行比较,并查看哪些匹配:
eta:~% md5sum /etc/localtime 410c65079e6d14f4eedf50c19bd073f8 /etc/localtime eta:~% find /usr/share/zoneinfo -type f | xargs md5sum | grep 410c65079e6d14f4eedf50c19bd073f8 410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/London 410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Belfast 410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Guernsey 410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Jersey 410c65079e6d14f4eedf50c19bd073f8 /usr/share/zoneinfo/Europe/Isle_of_Man ... ...
当然, 缺点 是它会告诉您所有与当前时区相同的时区。(这意味着完全相同-不仅是“当前同时”,而且“只要系统知道,总是在同一天更改其时钟”)。
你最好的选择可能是上述方法相结合:用/etc/timezone如果存在; 否则尝试解析/etc/localtime为符号链接;如果失败,则搜索匹配的时区定义文件;如果失败了-放弃并回家;-)
(而且我不知道以上任何一项是否适用于AIX …)