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


115

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

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

最終日に変更されたファイルに対して、rsyncfind's -mtime -1flagのようなものを使用してファイルを試行しようとしましたが、運がありませんでした。

scp現在のファイルをコピーするだけで構わないのですが、現在のところdate +%Y%m%d、各サーバーで実行すると異なる日が表示される4時間のウィンドウがあり、少しバグがあります。

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

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

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


EDTは、少なくともLinuxでは認識されているタイムゾーンではありません。「注意してください!」wholeい話全体については、以下に答えてください。* NIXのブランドでEDTが認識されている場合でも、注意を払ってタイムゾーン文字列を再確認する必要があります。
マイクS

回答:


175

そのため、クエリの期間にタイムゾーンを設定できます。

TZ=America/New_York date

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

env TZ=America/New_York date

tl; dr

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

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

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

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

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

SUSv3またはPOSIX-2001として知られるSingle UNIX Specification、バージョン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


私が間違っているかどうかはexportenv
わかり

@JRFerguson-ラスベガスやネバダ州などのタイムゾーンがリストに含まれていない場合、時間を検証する代替手段は何ですか?
動機付け

@Motivated都市または州が含まれていない場合は、あなたと同じゾーン情報を使用するものを選択します。たとえば、私はニューヨークと同じタイムゾーンを使用しているフロリダにいるので、私のマシンはニューヨーク時間に同期します。
JRFerguson

1
@JRFerguson-これは、その人がさまざまなタイムゾーンを認識しており、あなたの場合はニューヨークなどの代替手段を使用できることを前提としています。それが唯一の選択肢でしょうか?たとえば、私はヨーロッパに住んでおらず、重複するタイムゾーンを知りません。
動機付け

1
@Motivated このサイトのようなものを使用すると、ゾーン内の他のポイントを見つけるのに役立ちます。
JRFerguson

33

これを行うには、TZ環境変数を操作します。以下は、US / Easternの現地時間を提供します。これは、DSTがロールバックするときにDSTを処理するのに十分スマートです。

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

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


17

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

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

-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

YMMV:MacOS / BSDボックスでは、不正な形式のTZ文字列がUTC時間を返します。
マークハドソン


6

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

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

#!/ bin / sh
#
#指定した(または現在の)時間を他のタイムゾーンのベース時間から出力します
#およびその逆
#

#変換元/変換先のベースタイムゾーン
TZBASE =ヨーロッパ/アテネ

#表示するタイムゾーン
#その他の名前については/ 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"
他に
  time = `date +%T`
fi

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

  TZ = $ TZOUT date --date = 'TZ = "' $ TZIN '"' "$ time" + "$ time $ TZINは$ TZOUT $ FORMAT"
}

$ TZONESのtzの場合。行う
  ショータイム$ TZBASE $ tz
やった

エコー

$ TZONESのtzの場合。行う
  showtime $ tz $ TZBASE
やった


3

多くの場合、ローカルタイムゾーンにタイムスタンプがあり、リモートtzに変換する必要があります。次の方法で実行できます。

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

どこ:

America/Curacao - remote timezone
MSK - local timezone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.