現在Linuxにいるタイムゾーンを確認する方法はありますか?
通常、TZ
環境変数は何か役に立つことを教えてくれます。ただし、time_t
と現地のタイムゾーン表現の間の変換には、mktime()
やlocaltime()
などの関数を使用するのが最善です。つまり、自分で変換しようとしないでください。
コンソールから行った場合は、次のように入力してください。
date +%Z
数値のタイムゾーンが必要な場合:
date +'%:z %Z'
出力例:
-05:00 EST
代わりに「US/Eastern」または「Europe/London」の形式でタイムゾーンを見つけたいと思いました。あなたはこれを見つけることができます:
ZONE="US/Eastern"
としてまたは、/ etc/localtimeを/ usr/share/zoneinfoの下にあるファイルの1つと一致させることもできます。厄介なことにこれはシンボリックリンクのようには思えませんが、あなたはできます。
cd/usr/share/zoneinfo
find * -type f -exec sh -c "diff -q/etc/localtime '{}'>/dev/null && echo {}" \;
一致するファイルを見つけるには - おそらくそれを行うより良い方法がありますが、それはうまくいきます。複数の試合があります。
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
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0
だから私はMountain Timeにいます。上記の環境変数の使用方法やdateコマンドの出力方法に関するアドバイスは、使用方法によってはうまく機能することがあります。
/sbin/hwclock --systohc [--utc]
と入力します。ハードウェアクロックがUTCとして保存されているかどうかにかかわらず、Linuxカーネルは常に1970年1月1日UTCの深夜0時からの経過秒数で時刻を保存および計算します。現地時間への変換は実行時に行われます。これに関する1つのきちんとしたことは、誰かが異なるタイムゾーンからあなたのコンピュータを使っている場合、彼らはTZ環境変数を設定することができ、すべての日付と時刻は彼らのタイムゾーンに対して正しいように見えるということです。
1970年1月1日のUTC以降の秒数が符号付き32ビット整数として保存されている場合(Linux/Intelシステムの場合と同様)、2038年には時計が動作しなくなります。LinuxにはY2K固有の問題はありませんしかし、2038年問題があります。うまくいけば、私たち全員がそれまでに64ビットシステム上でLinuxを実行するようになるでしょう。 64ビット整数は私達の時計をおよそ292271百万年までかなりうまく動かせ続けるでしょう。
タイムゾーンには、地理位置情報を使用できます。
$ curl https://ipapi.co/timezone
America/Chicago
または
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
いくつかの解決策:
date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone
私に(それぞれ)与えました:
UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC
私のコンピュータはUTCにあります。
日付とタイムゾーンを同時に表示できます。
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'
TZまたはdate IS NOT RELIABLEを使用すると、デフォルトのシステムタイムゾーンではなく、ユーザーのタイムゾーンがわかります。
デフォルトのシステムタイムゾーンは/ 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
参考文献: この答えで 。