105

時間を入力して、python で他のタイムゾーンに変換する簡単な方法を探しています (おそらく最大 10 の異なるタイムゾーン)

ごめん。私はPythonの時間にまったく慣れていません。誰かが私を正しい方向に導くことができれば、本当に感謝しています。

4

10 に答える 10

119

関心のある「瞬間」を utc-timezone 対応の datetime オブジェクトに変換するのが最善の方法であることがわかりました (Python では、timezone コンポーネントはdatetimeオブジェクトに必要ありません)。

次に、astimezoneを使用して、目的のタイムゾーンに変換できます (参照)。

from datetime import datetime
import pytz

utcmoment_naive = datetime.utcnow()
utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc)

# print "utcmoment_naive: {0}".format(utcmoment_naive) # python 2
print("utcmoment_naive: {0}".format(utcmoment_naive))
print("utcmoment:       {0}".format(utcmoment))

localFormat = "%Y-%m-%d %H:%M:%S"

timezones = ['America/Los_Angeles', 'Europe/Madrid', 'America/Puerto_Rico']

for tz in timezones:
    localDatetime = utcmoment.astimezone(pytz.timezone(tz))
    print(localDatetime.strftime(localFormat))

# utcmoment_naive: 2017-05-11 17:43:30.802644
# utcmoment:       2017-05-11 17:43:30.802644+00:00
# 2017-05-11 10:43:30
# 2017-05-11 19:43:30
# 2017-05-11 13:43:30

そのため、ローカル タイムゾーン (存在する時間) で関心のある瞬間を使用して、このように utc に変換します (参照)。

localmoment_naive = datetime.strptime('2013-09-06 14:05:10', localFormat)

localtimezone = pytz.timezone('Australia/Adelaide')

try:
    localmoment = localtimezone.localize(localmoment_naive, is_dst=None)
    print("Time exists")

    utcmoment = localmoment.astimezone(pytz.utc)

except pytz.exceptions.NonExistentTimeError as e:
    print("NonExistentTimeError")
于 2013-09-05T22:13:24.873 に答える
59

ピッツの使用

from datetime import datetime
from pytz import timezone

fmt = "%Y-%m-%d %H:%M:%S %Z%z"
timezonelist = ['UTC','US/Pacific','Europe/Berlin']
for zone in timezonelist:

    now_time = datetime.now(timezone(zone))
    print now_time.strftime(fmt)
于 2012-06-12T13:28:32.993 に答える
10

Python であるタイムゾーンの時間を別のタイムゾーンに変換するには、次を使用datetime.astimezone()できます。

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone)

指定されたaware_dt(datetimeあるタイムゾーンのオブジェクト)、それを他のタイムゾーンに変換し、指定された時間形式で時刻を出力するには:

#!/usr/bin/env python3
import pytz  # $ pip install pytz

time_format = "%Y-%m-%d %H:%M:%S%z"
tzids = ['Asia/Shanghai', 'Europe/London', 'America/New_York']
for tz in map(pytz.timezone, tzids):
    time_in_tz = aware_dt.astimezone(tz)
    print(f"{time_in_tz:{time_format}}")

f""構文が利用できない場合は、それを置き換えることができます"".format(**vars())

aware_dtローカルタイムゾーンの現在の時刻から設定できる場所:

from datetime import datetime
import tzlocal  # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
aware_dt = datetime.now(local_timezone) # the current time

または、ローカル タイムゾーンの入力時刻文字列から:

naive_dt = datetime.strptime(time_string, time_format)
aware_dt = local_timezone.localize(naive_dt, is_dst=None)

time_stringようになります'2016-11-19 02:21:42'。に対応していtime_format = '%Y-%m-%d %H:%M:%S'ます。

is_dst=None入力時刻文字列が DST 移行中など、存在しないかあいまいなローカル時刻に対応する場合、例外を強制します。is_dst=False、を渡すこともできますis_dst=True。詳細については、Python: How do you convert datetime/timestamp from one timezone to another timezone? のリンクを参照してください。

于 2016-11-18T18:41:17.227 に答える
7

Python のタイムゾーン変換には、Taavi Burns によるPyCon 2012プレゼンテーションの便利なテーブルを使用します。

于 2012-10-26T09:40:48.663 に答える
6

注意: この回答の最初の部分は、振り子のバージョン 1.x です。バージョン 2.x の回答については、以下を参照してください。

手遅れにならないことを願っています!

pendulumライブラリは、この計算やその他の日時計算に優れています。

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.datetime.strptime(heres_a_time, '%Y-%m-%d %H:%M %z')
>>> for tz in some_time_zones:
...     tz, pendulum_time.astimezone(tz)
...     
('Europe/Paris', <Pendulum [1996-03-25T17:03:00+01:00]>)
('Europe/Moscow', <Pendulum [1996-03-25T19:03:00+03:00]>)
('America/Toronto', <Pendulum [1996-03-25T11:03:00-05:00]>)
('UTC', <Pendulum [1996-03-25T16:03:00+00:00]>)
('Canada/Pacific', <Pendulum [1996-03-25T08:03:00-08:00]>)
('Asia/Macao', <Pendulum [1996-03-26T00:03:00+08:00]>)

Answerには、振り子で使用できるタイムゾーンの名前がリストされています。(それらは pytz の場合と同じです。)

バージョン 2 の場合:

  • some_time_zonesプログラムで使用される可能性のあるタイムゾーンの名前のリストです
  • heres_a_time'-0400' の形式のタイム ゾーンを含むサンプル時間です。
  • 後続の処理のために時間を振り子時間に変換することから始めます
  • これで、各タイム ゾーンの時刻を表示できるようになりました。show_time_zones

...

>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.from_format('1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ')
>>> for tz in some_time_zones:
...     tz, pendulum_time.in_tz(tz)
...     
('Europe/Paris', DateTime(1996, 3, 25, 17, 3, 0, tzinfo=Timezone('Europe/Paris')))
('Europe/Moscow', DateTime(1996, 3, 25, 19, 3, 0, tzinfo=Timezone('Europe/Moscow')))
('America/Toronto', DateTime(1996, 3, 25, 11, 3, 0, tzinfo=Timezone('America/Toronto')))
('UTC', DateTime(1996, 3, 25, 16, 3, 0, tzinfo=Timezone('UTC')))
('Canada/Pacific', DateTime(1996, 3, 25, 8, 3, 0, tzinfo=Timezone('Canada/Pacific')))
('Asia/Macao', DateTime(1996, 3, 26, 0, 3, 0, tzinfo=Timezone('Asia/Macao')))
于 2017-09-08T15:30:47.237 に答える
4

Python 3.2+の場合、 simple-dateは pytz のラッパーであり、物事を単純化しようとします。

あなたが持っているtime場合

SimpleDate(time).convert(tz="...")

あなたが望むことをするかもしれません。しかし、タイムゾーンは非常に複雑なものであるため、かなり複雑になる可能性があります。ドキュメントを参照してください。

于 2013-09-05T23:21:06.943 に答える