web-dev-qa-db-ja.com

「日付」に別のタイムゾーンの時刻を出力させるにはどうすればよいですか?

タイムゾーンをUTCに設定してサーバーを実行しています。それは一般的には良い習慣のように思えました(私が間違っている場合は修正してください)。

とにかく、scpファイルにアクセスするために接続するサーバーの1つがEDTで実行されており、コピーする必要があるファイルを/path/to/filename/data20120913の形式で保存しています

昨日変更されたファイルに対して、findの-mtime -1フラグなどを使用してrsyncファイルを試行することを検討しましたが、うまくいきませんでした。

scpを使用して当日のファイルをコピーするだけでもかまいませんが、現時点では、date +%Y%m%dを実行すると各サーバーで異なる日が表示される4時間のウィンドウがあり、少しバグがあります。

man dateを見ると、時間出力をUTCとして出力できることがわかりますが、EDTのような別のタイムゾーンとして出力する方法がありません。

GNU日付拡張date -d 20100909 +%sのようなものを使用して、エポックから秒単位で日付を取得し、手動で4 * 60 * 60秒の計算を適用し、それを日付としてレンダリングすることを確認することもできますが、それが始まる日中の時間はまだ1時間オフです。

YYYYMMDDに設定されているサーバーでEDTUTC形式で日付を出力する簡単な方法はありますか?

119
cwd

したがって、クエリの期間にタイムゾーンを設定できます。

TZ=America/New_York date

TZ設定とdateコマンドの間の空白に注意してください。 Bourneライクおよびrc- likeシェルでは、コマンドラインに対してのみTZ変数を設定します。他のシェル(cshtcshfish)では、代わりに常にenvコマンドを使用できます。

env TZ=America/New_York date

tl; dr

Linuxシステムの場合。タイムゾーンは、/usr/share/zoneinfoディレクトリのファイルで定義されます。この構造は、その創設者を称えるために「オルソンデータベース」と呼ばれることがよくあります。

各タイムゾーンの規則は、バイナリファイルにコンパイルされるテキストファイル行として定義されます。コンパイルされた行はゾーン名を定義します。ゾーンが適用されるデータと時間の範囲。標準時のUTCからのオフセット。また、該当する場合、夏時間への移行と夏時間への移行がどのように行われるかを定義する表記法。

たとえば、ディレクトリ "America"には、上記で使用したAmerica/New_Yorkファイルにニューヨークの必須情報が含まれています。

存在しないゾーン(ファイル名)の指定は黙って無視され、UTC時間が報告されることに注意してください。たとえば、これは誤った時間を報告します。

TZ="America/New York" date ### WRONG ###

SUSv3またはPOSIX-2001として知られているシングルUNIX仕様のバージョン3では、移植性のために、タイムゾーンの説明を識別する文字列はコロン文字で始める必要があると述べています。したがって、次のように書くこともできます。

TZ=":America/New_York" date
TZ=":America/Los_Angeles" date

記述ファイルへのパス名を使用してタイムゾーンを指定する代わりの方法として、SUSv3はPOSIXモデルを記述します。この形式では、文字列は次のように定義されます。

std offset [dst[offset][,start-date[/time],end-date[/time]]]

ここで、stdは標準コンポーネント名、dstは夏時間の名前です。各名前は3文字以上で構成されています。 offsetは、本初子午線の西のタイムゾーンでは正であり、子午線の東のタイムゾーンでは負です。オフセットは現地時間に追加され、UTC(以前はGMTと呼ばれていました)を取得します。 startおよびend時間フィールドは、標準/夏時間の遷移がいつ発生するかを示します。

たとえば、米国東部では、標準時間はUTCより5時間早く、EST5EDTの代わりにAmerica/New_Yorkを指定できます。ただし、これらの代替案は常に認識されているわけではありませんが、特に米国外のゾーンの場合は避けてください。

HP-UX(SUSv3準拠のUNIX)は、/usr/lib/tztabのテキストルールと、EST5EDT、CST6CDT、MST7MDT、PST8PDTなどのPOSIX名を使用します。このファイルには、Olsonデータベースと同様に、各タイムゾーンのすべての履歴ルールが含まれています。

注:次のディレクトリを調べると、すべてのタイムゾーンを見つけることができるはずです:/usr/share/zoneinfo

186
JRFerguson

これを行うには、TZ環境変数を操作します。次の例では、米国/東部の現地時間を示します。これは、DSTが巡回するときにDSTを処理するのにも十分スマートです。

# all on one line
TZ=":US/Eastern" date +%Y%m%d

ゾーン名は、/usr/share/zoneinfo内のファイルとディレクトリに由来します。

33

注意してください! Dateは、認識できないタイムゾーンを指定すると、現在のタイムゾーンの時刻を喜んで吐き出します。

これをチェックしてください:

-bash-4.2$ env TZ=EDT date
Wed Feb 18 19:34:41 EDT 2015
-bash-4.2$ date
Wed Feb 18 19:34:43 UTC 2015

EDTと呼ばれるタイムゾーンがないことに注意してください。実際のところ、

-bash-4.2$ find /usr/share/zoneinfo -name "*EDT*"

戻り値

/usr/share/zoneinfo/EST5EDT
/usr/share/zoneinfo/posix/EST5EDT
/usr/share/zoneinfo/right/EST5EDT

そしてこれはうまくいきます:

-bash-4.2$ TZ=EST5EDT date
Wed Feb 18 14:36:59 EST 2015
-bash-4.2$ date
Wed Feb 18 19:37:01 UTC 2015

ただし、友人が神秘的な土地であるGobbledygookに住んでいて、そのゾーン情報が自分のゾーン情報と一致する場合は、Gobbledygookのゾーンで日付を出力することができます。終了値をnaryに設定すると、ゾーンは認識されていません:

-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0
20
Mike S
TODAY=$(TZ=":US/Eastern" date)
echo $TODAY
9
Lin

date構文は難解でエラーが発生しやすいため、コマンドラインの呼び出しが面倒です。そのため、小さなスクリプト(名前はworldtime)を記述しました。これは、他のタイムゾーンのベースタイムゾム(ローカルタイム)とその逆から、指定された(または現在の)時間を出力します。

ここにあります。ニーズに合わせて調整し、パスに入れて、実行可能にします。

#!/ bin/sh 
#
#他のタイムゾーンの基準時間から指定された(または現在の)時間を出力します
#およびその逆
#
 
#変換元/変換元のベースタイムゾーン
 TZBASE = Europe/Athens 
 
#表示するタイムゾーン
#その他の名前については、/ usr/share/zoneinfo /を参照してください
 TZONES = 'UTC America/Los_Angeles America/New_York Europe/London Europe/Paris' 
 
#表示形式
 FORMAT = '%H:%M(%p)%Z%a%m%b%Y' 
 
 if ["$ 1"];次に
 time = "$ 1" 
 else 
 time = `date +%T` 
 fi 
 
#時間を表示指定された出力の指定された入力タイムゾーンから
#タイムゾーン
 showtime()
 {
 TZIN = $ 1 
 TZOUT = $ 2 
 
 TZ = $ TZOUT date --date = 'TZ = "' $ TZIN '"' "$ time" + "$ time $ TZIN is $ TZOUT $ FORMAT" 
} 
 
 $ TZONESのtz用do 
 showtime $ TZBASE $ tz 
 done 
 
 echo 
 
 for tz for $ TZONES; do 
 showtime $ tz $ TZBASE 
完了
 
7

多くの場合、ローカルタイムゾーンのタイムスタンプがあり、それをリモートtzに変換する必要があります。それは次のようにして行うことができます:

TZ=America/Curacao date -d 'Tue Nov 28 00:07:05 MSK 2016'

どこ:

America/Curacao - remote timezone
MSK - local timezone
3
dimcha