web-dev-qa-db-ja.com

現在のタイムゾーンを「地域/都市」として取得します

残念ながら timedatectl set-timezone/etc/timezone を更新しません。

現在のタイムゾーンをRegion/Cityとして取得するには、たとえば、次のように指定します。

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

私は最後の部分を手に入れることができます:

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

すべてのawk- wardを取得せずにAsia/Kuala_Lumpurパーツを取得するにはどうすればよいですか?

Linuxを使用していますが、POSIXの方法もありますか?

8
Tom Hale

StéphaneChazelasによるこのコメント で、彼は言った:

timedatectlsystemdに対してtimedatedをクエリするdbusであり、timedatedはタイムゾーンの名前を導出します(_Europe/London_など) )_/etc/localtime_でreadlink()を実行します。 _/etc/localtime_がシンボリックリンクでない場合、それらのタイムゾーン定義ファイルにはその情報が含まれていないため、その名前を取得できません。

これと toniocのコメント に基づいて、以下をまとめます。

_#!/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
_
3
Tom Hale

タイムゾーンには、地理位置情報を使用できます。

$ 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

4
Steven Penny