获取当前时区作为“地区/城市”

获取当前时区作为“地区/城市”

很遗憾timedatectl set-timezone不更新/etc/timezone

如何获取当前时区Region/City,例如,给定:

% timedatectl | grep zone
                       Time zone: Asia/Kuala_Lumpur (+08, +0800)

我可以得到最后一部分:

% date +"%Z %z"
+08 +0800

Asia/Kuala_Lumpur如何在不获得全部保护的情况下获得该部分awk

我使用的是 Linux,但是还有 POSIX 方式吗?

答案1

史蒂芬·查泽拉斯 (Stéphane Chazelas) 的评论, 他说:

timedatectl是通过执行 on查询systemd并派生时区名称(如)的东西。如果不是符号链接,则无法派生该名称,因为这些时区定义文件不包含该信息。timedateddbustimedatedEurope/Londonreadlink()/etc/localtime/etc/localtime

基于此和托尼奥克的评论,我整理了以下内容:

#!/bin/bash
set -euo pipefail

if filename=$(readlink /etc/localtime); then
    # /etc/localtime is a symlink as expected
    timezone=${filename#*zoneinfo/}
    if [[ $timezone = "$filename" || ! $timezone =~ ^[^/]+/[^/]+$ ]]; then
        # not pointing to expected location or not Region/City
        >&2 echo "$filename points to an unexpected location"
        exit 1
    fi
    echo "$timezone"
else  # compare files by contents
    # https://stackoverflow.com/questions/12521114/getting-the-canonical-time-zone-name-in-shell-script#comment88637393_12523283
    find /usr/share/zoneinfo -type f ! -regex ".*/Etc/.*" -exec \
        cmp -s {} /etc/localtime \; -print | sed -e 's@.*/zoneinfo/@@' | head -n1
fi

答案2

对于时区,您可以使用地理位置:

$ curl https://ipapi.co/timezone
America/Chicago

或者:

$ curl http://ip-api.com/line?fields=timezone
America/Chicago

http://wiki.archlinux.org/index.php/time#Time_zone

相关内容