現在Linuxで使用しているタイムゾーンを確認する方法はありますか?
現在Linuxで使用しているタイムゾーンを確認する方法はありますか?
回答:
通常、TZ
環境変数は有用な情報を提供します。ただし、mktime()
やなどの関数を使用して、ローカルタイムゾーン表現とのlocaltime()
間time_t
で変換することをお勧めします。つまり、自分で変換しようとしないでください。
date
教えてくれます。
echo $TZ
何も返されません。
代わりに、「US / Eastern」または「Europe / London」形式でタイムゾーンを見つけたいと思いました。これは次の場所にあります。
ZONE="US/Eastern"
/ etc / sysconfig / clockまたは、/ etc / localtimeを/ usr / share / zoneinfoの下にあるファイルの1つに一致させることもできます。迷惑なことに、これはシンボリックリンクではないようですが、たとえば
cd / usr / share / zoneinfo
find * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
一致するファイルを見つけるには、おそらくもっと良い方法がありますが、それは機能します。複数の一致があります。
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Ubuntuではこれを試してください:
$ cat /etc/timezone
サンプル出力:
Asia/Kolkata
その他のディストリビューションのリファレンス:https : //unix.stackexchange.com/questions/110522/timezone-setting-in-linux
時には、正規のタイムゾーンではなくによって生成されるような短い形式を探している可能性がありdate %Z
例えばUS/Eastern
。timedatectl
Fedoraなどのシステムでtimedatectl
は、現在のゾーンを含む多くの有用な情報を出力します。
# timedatectl
Local time: Tue 2016-09-13 17:10:26 EDT
Universal time: Tue 2016-09-13 21:10:26 UTC
RTC time: Tue 2016-09-13 21:10:26
Time zone: US/Eastern (EDT, -0400)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
残念ながら、コマンドとして使用しtimedatectl
ますset-timezone
が、対応するがありませんget-timezone
。次のように解析します。
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
タイムゾーンでは、位置情報を使用できます。
$ curl https://ipapi.co/timezone
America/Chicago
または:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
して、ハードウェアクロックを設定します。Linuxカーネルは、ハードウェアクロックがUTCとして保存されているかどうかに関係なく、1970年1月1日の午前0時からの秒数として常に時間を保存および計算します。現地時間への変換は実行時に行われます。これに関する1つのすてきなことは、誰かが別のタイムゾーンからコンピューターを使用している場合、TZ環境変数を設定でき、すべての日付と時刻がそのタイムゾーンに対して正しいように見えることです。
UTC(1970年1月1日)からの秒数が符号付き32ビット整数として保存されている場合(Linux / Intelシステムの場合)、2038年にクロックが停止します。Linuxには固有のY2K問題はありません、しかし2038年問題があります。それまでに64ビットシステムでLinuxを実行できることを願っています。64ビット整数は、およそ292271百万年まで、時計の動作を維持します。
TZまたは日付を使用すると、デフォルトのシステムタイムゾーンではなく、ユーザーのタイムゾーンが通知されるため、信頼できません。
デフォルトのシステムタイムゾーンは/ etc / timezone(多くの場合、タイムゾーンに固有のタイムゾーンデータファイルへのシンボリックリンクです)に保存されます。/ etc / timezoneがない場合は、/ etc / localtimeを見てください。通常、これは「サーバー」のタイムゾーンです。/ etc / localtimeは、多くの場合、/ usr / share / zoneinfo内のタイムゾーンファイルへのシンボリックリンクです。正しいタイムゾーンファイルへのパスは、多くの場合、地理情報も提供します。
新しいLinuxには、コマンドの実行時に大量の情報を提供する「timedatectl」があります。
(サイドノードとして、古いハードコーディングされたタイムゾーンをまだ使用している古代のシステムがある場合は、おそらく現代のタイムゾーンファイルをその上にコピーすることができ、それは機能します。古い機器で)。
時々timedatectl set-timezone
更新しない/etc/timezone
ので、シンボリックリンクが/etc/timezone
指すファイルの名前からtiemzoneを取得するのが最善です:
#!/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
参照:この回答では。