3

Linuxで、次のような特定の時間文字列のUTC時間をプログラムで取得する方法はありますか

Tue Dec  14 10:30:23 PST 2012
Tue Jan  4 11:30:23 EST 2013

ローカル タイム ゾーンの設定に関係なく (および変更せずに) UTC 時間にしますか?

4

2 に答える 2

6

更新: 最近の tz データベースの結果は異なります: EST は、特定の日付に対して同じ utc オフセットを生成します(以前の結果と比較してください)。異なるタイムゾーンが同じ略語を使用する可能性があるため、同じ略語が異なる utc オフセットに対応する可能性があるという一般的な結論には影響しませんが。Pythonでタイムゾーンの省略名を使用して日付/時刻文字列を解析するを参照してください?


EST などの短縮されたタイムゾーン名は、あいまいな場合があります。

#!/bin/sh
for tz in Australia/Brisbane Australia/Sydney America/New_York
do date -u -d"TZ=\":$tz\" Tue Jan  4 11:30:23 EST 2013"
done

出力

Fri Jan  4 16:30:23 UTC 2013
Fri Jan  4 00:30:23 UTC 2013
Fri Jan  4 16:30:23 UTC 2013

2つのこと:

  • 日付文字列は、使用されるタイムゾーンによって異なる時点として解釈される場合があります

  • dateつまり、別のタイムゾーンに属していると解釈しAustralia/Brisbaneます。それがなければ正しい時間を生成します:UTC+10dateESTEST

      $ date -u -d 'TZ=":Australia/Brisbane" Tue Jan  4 11:30:23 2013'
      Fri Jan  4 01:30:23 UTC 2013
    

与えられた時間とタイムゾーンの略語のすべての可能な UTC 時間を見つけるには、たとえば、次のようにし'Tue Jan 4 11:30:23 EST 2013'ます。

#!/usr/bin/env python
from collections import defaultdict
from datetime import datetime
import pytz # $ sudo apt-get install python-tz
            # or if you can't install system-wide
            # $ pip install --user pytz

## Tue Dec  14 10:30:23 PST 2012
#naive_dt, tzname = datetime(2012, 12, 14, 10, 30, 23), 'PST'
## -> Fri Dec 14 18:30:23 2012 UTC

# Tue Jan  4 11:30:23 EST 2013
naive_dt, tzname = datetime(2013, 1, 4, 11, 30, 23), 'EST'
# Fri Jan  4 01:30:23 2013 UTC
# Fri Jan  4 00:30:23 2013 UTC
# Fri Jan  4 16:30:23 2013 UTC
# ambiguous
 
utc_times = defaultdict(list)
for zone in pytz.all_timezones:
    dt = pytz.timezone(zone).localize(naive_dt, is_dst=None)
    if dt.tzname() == tzname: # same timezone abbreviation
        utc_times[dt.astimezone(pytz.utc)].append(zone)

for utc_dt, timezones in utc_times.items():
    print("%s:\n\t%s" % (utc_dt.strftime('%c %Z'), '\n\t'.join(timezones)))

出力

Tue Jan 4 11:30:23 EST 2013対応するタイムゾーン名を持つ UTC としてのすべての解釈:

Fri Jan  4 01:30:23 2013 UTC:
    Australia/Brisbane
    Australia/Lindeman
    Australia/Queensland
Fri Jan  4 00:30:23 2013 UTC:
    Australia/ACT
    Australia/Canberra
    Australia/Currie
    Australia/Hobart
    Australia/Melbourne
    Australia/NSW
    Australia/Sydney
    Australia/Tasmania
    Australia/Victoria
Fri Jan  4 16:30:23 2013 UTC:
    America/Atikokan
    America/Cayman
    America/Coral_Harbour
    America/Detroit
    ...
    America/New_York
    ...
    America/Toronto
    Canada/Eastern
    EST
    EST5EDT
    Jamaica
    US/East-Indiana
    US/Eastern
    US/Michigan
于 2012-12-04T23:27:54.450 に答える
2

date -u -d "Tue Dec 14 10:30:23 PST 2012"報告しFri Dec 14 18:30:23 UTC 2012ます。この不一致は、2012 年 12 月 14 日が実際には火曜日ではなく金曜日であるためです。おそらく有効な入力でよりうまく機能します...

于 2012-12-04T17:13:39.400 に答える