Python时区转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python时区转换相关的知识,希望对你有一定的参考价值。

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

抱歉。我根本不熟悉python的时间,如果有人能让我朝着正确的方向前进,我会非常感激。

答案

我发现最好的方法是将感兴趣的“时刻”转换为支持utc-timezone的日期时间对象(在python中,datetime对象不需要时区组件)。

然后你可以使用astimezone转换为感兴趣的时区(reference)。

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

所以,随着当地时区的兴趣时刻(exists的时间),你将它转换为这样的utc(reference)。

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中将一个时区中的时间转换为另一个时区,您可以使用use 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'

如果输入时间字符串对应于不存在或模糊的本地时间(例如在DST转换期间),则is_dst=None强制执行异常。你也可以通过is_dst=Falseis_dst=True。有关Python: How do you convert datetime/timestamp from one timezone to another timezone?的更多详细信息,请参阅链接

另一答案
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:日期时间字符串
  • 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']
另一答案

对于Python时区转换,我使用Taavi Burns的PyCon 2012 handy table中的presentation

另一答案

请注意:这个答案的第一部分是或者是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')))
另一答案

对于Python 3.2+,simple-date是pytz的包装器,试图简化事物。

如果你有time那么

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

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

以上是关于Python时区转换的主要内容,如果未能解决你的问题,请参考以下文章

Unix 纪元时间戳在 Python 中转换为 UTC 时区

Python时区转换

Python:如何在不知道 DST 是不是生效的情况下将时区感知时间戳转换为 UTC

如何将字符串转换为时间,使其具有时区意识,并在 Python 中转换时区?

python 通过pytz模块进行时区的转换,获取指定时区的时间

“美国/太平洋”时区的 Python Django 时区转换时间不正确