別のタイムゾーンで「日付」出力時間を作成するには?

別のタイムゾーンで「日付」出力時間を作成するには?

タイムゾーンをに設定して実行中のサーバーがありますUTC。これは一般的に良い習慣のようです(間違っている場合は訂正してください)。

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

rsync最後の日に修正されたファイルを見つけるためにfindフラグのようなものを試しましたが、-mtime -1まったく成功しませんでした。

今日のファイルだけをコピーするのは大丈夫ですが、scp現在は4時間のウィンドウがあり、実行はdate +%Y%m%d各サーバーで異なる日を提供するため、少し迷惑です。

見てman date、時間を次のように出力できることがわかりましたが、UTCそれを別の時間帯に出力する方法が見つかりませんでした。EDT

date私はまた、GNU拡張のようなものを使って、date -d 20100909 +%s奇跡の後の秒単位の日付を取得し、手動の秒計算を適用し、それがどのように日付としてレンダリングされるかを見ることができると思います4 * 60 * 60。しかし、夏時間が始まると、まだ1時間になります。

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

答え1

次のようにクエリ期間のタイムゾーンを設定できます。

TZ=America/New_York date

TZ設定とコマンドの間のスペースに注意してくださいdate。 Bourneに似たシェルでは、rc変数は現在のコマンドに対してのみ設定されます。TZ他のシェル(csh、、、 )では常に次のtcshものfishを使用できますenv

env TZ=America/New_York date

長すぎます。

Linuxシステムで。タイムゾーンはディレクトリ内のファイルで定義されています/usr/share/zoneinfo。このような構造をよく呼びます。「オールソンデータベース」創立貢献者を称えるため。

各タイムゾーンのルールはテキストファイルの行として定義され、バイナリファイルにコンパイルされます。このようにコンパイルされた行は、そのゾーンが適用されるデータと時間範囲、および該当する場合は夏時間の変換方法を定義する表記法を定義します。

America/New_Yorkたとえば、「America」ディレクトリには、上記のファイルからNew Yorkに必要な情報が含まれています。

存在しない領域(ファイル名)の仕様は自動的に無視され、UTC時間が報告されます。たとえば、次は間違った時間を報告します。

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

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

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)を取得するには、現地時間にオフセットを追加してください。および時間フィールドは、標準/日光変換が発生するタイミングを示しますstartend

たとえば、米国東部では、標準時がUTCより5時間速く、代わりにEST5EDTそれを指定できますAmerica/New_York。しかし、これらの選択肢は特に米国以外の地域では常に認識されていないため、避けるのが最善です。

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

メモ:次のディレクトリを確認すると、すべてのタイムゾーンを見つけることができます。/usr/share/zoneinfo

答え2

TZ環境変数を操作してこれを行うことができます。以下は、DSTが到着したときにそれを処理するのに十分スマートな米国/東部地域の現地時間を提供します。

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

ゾーン名は内部ファイルとディレクトリから来ます/usr/share/zoneinfo

答え3

注意してください!認識できないタイムゾーンを指定すると、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ゾーンの時間を出力させることができ、終了値なしで幸せになります。領域がわからない:

-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0

答え4

これ日付構文があいまいでエラーが発生しやすく、コマンドライン呼び出しが難しくなります。だから私は小さなスクリプトを書いた。ワールドタイム)、他のタイムゾーンのデフォルトタイムゾーン(現地時間)で指定された(または現在の)時間を印刷し、その逆の場合も同様です。

ここにいます。必要に応じて調整し、パスに入れて実行可能にします。

#!/bin/sh
#
#他のタイムゾーンのデフォルト時刻から指定された(または現在の)時刻を印刷します。
#そしてその逆
#

#変換基準タイムゾーン
TZBASE=ヨーロッパ/アテネ

#Time Zone
#より多くの名前については/usr/share/zoneinfo/をご覧ください。
TZONES='UTC アメリカ/Los_Angeles アメリカ/New_York ヨーロッパ/ロンドン ヨーロッパ/パリ'

# 表示形式
形式='%H:%M (%p) %Z %a %m %b %Y'

その場合、["$ 1"];
  時間="$1"
その他
  時間= `日付+% T`
フィリピン諸島

#指定された出力に指定された入力タイムゾーンの時間を表示します。
#タイムゾーン
ショータイム()
{
  TZIN=$1
  TZOUT=$2

  " TZ=$TZOUT 日付 --date='TZ="'$TZIN'"'" $time" +"$time $TZIN は $TZOUT $FORMAT です。
}

$ TZONESのtzについては、次のようにします。
  ショータイム $TZBASE $tz
完璧

エコ

$ TZONESのtzについては、次のようにします。
  ショータイム $tz $TZBASE
完璧

関連情報