It's 很难得到可靠的答案 http://web.archive.org/web/20130209072352/http://www.chronos-st.org/Discovering%20the%20Local%20Time%20Zone--Why%20It%27s%20a%20Hard%20Problem.html。依赖于诸如/etc/timezone
可能是最好的选择。
(变量tzname
和tm_zone
成员struct tm
正如其他答案中所建议的,通常包含缩写,例如GMT
/BST
等,而不是问题中要求的奥尔森时间字符串)。
- 在基于 Debian 的系统(包括 Ubuntu)上,
/etc/timezone
是一个包含正确答案的文件。
- 在一些基于 Redhat 的系统上(至少包括 CentOS、RHEL、Fedora 的某些版本),您可以使用 readlink() 获取所需的信息
/etc/localtime
,这是一个符号链接(例如)/usr/share/zoneinfo/Europe/London
.
- OpenBSD 似乎使用与 RedHat 相同的方案。
然而,上述方法存在一些问题。这/usr/share/zoneinfo
目录还包含文件,例如GMT
and 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...)