タイムゾーンを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
に設定されているサーバーでEDT
のUTC
形式で日付を出力する簡単な方法はありますか?
したがって、クエリの期間にタイムゾーンを設定できます。
TZ=America/New_York date
TZ
設定とdate
コマンドの間の空白に注意してください。 Bourneライクおよびrc
- likeシェルでは、コマンドラインに対してのみTZ
変数を設定します。他のシェル(csh
、tcsh
、fish
)では、代わりに常に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
。
これを行うには、TZ
環境変数を操作します。次の例では、米国/東部の現地時間を示します。これは、DSTが巡回するときにDSTを処理するのにも十分スマートです。
# all on one line
TZ=":US/Eastern" date +%Y%m%d
ゾーン名は、/usr/share/zoneinfo
内のファイルとディレクトリに由来します。
注意してください! 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
TODAY=$(TZ=":US/Eastern" date)
echo $TODAY
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 完了
多くの場合、ローカルタイムゾーンのタイムスタンプがあり、それをリモートtzに変換する必要があります。それは次のようにして行うことができます:
TZ=America/Curacao date -d 'Tue Nov 28 00:07:05 MSK 2016'
どこ:
America/Curacao - remote timezone
MSK - local timezone