这比听起来更复杂。大多数Linux发行版都有不同的做法,所以没有100%可靠的方法来获得Olson TZ的名称。
下面是我在过去已经使用了启发式:
- 首先检查/ etc /时区,如果它存在使用它。
- 下一个检查,如果在/ etc/localtime就是符号链接的时区数据库
- 否则找到具有相同内容 的文件在/ usr/share/zoneinfo中一个文件/ etc /本地时间
未测试示例代码:
if [ -f /etc/timezone ]; then
OLSONTZ=`cat /etc/timezone`
elif [ -h /etc/localtime ]; then
OLSONTZ=`readlink /etc/localtime | sed "s/\/usr\/share\/zoneinfo\///"`
else
checksum=`md5sum /etc/localtime | cut -d' ' -f1`
OLSONTZ=`find /usr/share/zoneinfo/ -type f -exec md5sum {} \; | grep "^$checksum" | sed "s/.*\/usr\/share\/zoneinfo\///" | head -n 1`
fi
echo $OLSONTZ
注意这个简单的例子不处理在多个TZ名给出的文件相匹配(在/ usr/share/zoneinfo中观察时)的情形。明确适当的TZ名称将取决于您的应用程序。
-nick
我会说“PDT”更接近规范的名称,而“美国/洛杉矶”只是一个描述性的标签,以帮助映射到正确的时区的位置。 – chepner
我不认为这是可能的;即使明确地扩展(例如到“太平洋夏令时”),单个缩写也可具有多个相应的TZ数据库条目。例如,PDT不仅是'America/Los_Angeles',还有'America/Dawson','America/Ensenada','America/Sitka','America/Tijuana','America/Vancouver','America/Whitehorse'和“美国/太平洋”。 (事实上,如果你没有指定你想要'America/Los_Angeles',我会认为你想'美国/太平洋'。) – ruakh