Python时区转换

我正在寻找一个快速的方式来键入一个时间,然后Python将其转换为其他时区(可能最多10个不同的时区)

抱歉。 如果有人能把我放在正确的方向,我真的不胜感激。

我发现最好的方法是将感兴趣的“时刻”转换为utc-timezone-aware的datetime对象(在python中,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 

因此,在当地时区有兴趣的时刻( JF Sebastian的评论中提到的那个时刻),您可以像这样( 参考 )将其转换为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") 

使用pytz

 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) 

要将一个时区中的时间转换为Python中的另一个时区,可以使用datetime.astimezone()

 time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone) 

给出aware_dt (某个时aware_dtdatetime对象),将其转换为其他时区,并以给定的时间格式打印时间:

 #!/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())replace它"".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 

或从本地时区的input时间string:

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

'2016-11-19 02:21:42'可能看起来像: '2016-11-19 02:21:42' 。 它对应于time_format = '%Y-%m-%d %H:%M:%S'

is_dst=None如果input时间string对应于不存在或不明确的本地时间(例如在DST转换期间),则强制exception。 你也可以传递is_dst=Falseis_dst=True 。 在Python中查看更多详细信息的链接:如何将datetime / timestamp从一个时区转换为另一个时区?

对于Python时区转换,我使用Taavi Burns的PyCon 2012 演示文稿中的便捷表格 。

对于Python 3.2+ 简单date是围绕Pytz的包装,试图简化事情。

如果你有time

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

可以做你想做的事情。 但时区是相当复杂的事情,所以它可以变得更加复杂 – 请参阅文档 。

 import datetime import pytz def convert_datetime_timezone(dt, tz1, tz2): tz1 = pytz.timezone(tz1) tz2 = pytz.timezone(tz2) dt = datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S") dt = tz1.localize(dt) dt = dt.astimezone(tz2) dt = dt.strftime("%Y-%m-%d %H:%M:%S") return dt 

  • dt :date时间string
  • tz1 :初始时区
  • tz2 :目标时区

 > convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "PST8PDT") '2017-05-13 05:56:32' > convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "UTC") '2017-05-13 12:56:32' 

 > pytz.all_timezones[0:10] ['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 'Africa/Asmera', 'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau'] 

我希望我还不迟!

钟摆库擅长这个和其他date时间计算。

 >>> 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]>) 

答案列出了摆锤可能使用的时区的名称。 (他们和Pytz一样。)