python中人类可读的时区?

shi*_*jan 3 timezone datetime localtime python-3.x

如何从python中的这些时间格式获得人类可读的时区?

以及如何将同一时间转换为该时区?

'scheduled_datetime': '2017-07-30T10:00:00+05:30'

session.scheduled_datetime
datetime.datetime(2017, 7, 30, 10, 0, tzinfo=<DstTzInfo 'Asia/Kolkata' IST+5:30:00 STD>)
Run Code Online (Sandbox Code Playgroud)

小智 5

你可以用iso8601或来做到dateutil.parser

import iso8601
import dateutil.parser
from pytz import timezone

fmt = '%Y-%m-%d %H:%M:%S %Z'
ist =  timezone('Asia/Kolkata')

str = '2017-07-30T10:00:00+05:30'
d = iso8601.parse_date(str).astimezone(ist)
print(d.strftime(fmt))

d = dateutil.parser.parse(str).astimezone(ist)
print(d.strftime(fmt))
Run Code Online (Sandbox Code Playgroud)

这两种情况的输出是:

2017-07-30 10:00:00 IST


请注意,我使用了Asia/Kolkata而不是IST. 这是因为这些 3 个字母的名称含糊不清且不标准IST可以是印度标准时间以色列标准时间爱尔兰标准时间(最后一个也称为爱尔兰夏令时,因为它是爱尔兰夏令时期间使用的时区)。

始终更喜欢使用IANA 时区名称(始终采用 格式Continent/City,如America/Sao_PauloEurope/Berlin)。如果Asia/Kolkata不是您需要的,请查看此列表以找到最适合您情况的列表。


如果你不知道使用哪个时区,想根据偏移量来猜测,恐怕没那么简单。

以您的输入为例:偏移量为+05:30(UTC 前 5 小时 30 分钟)。有多个时区使用此偏移量(或在其历史记录中使用过一次)。维基百科链接包含 3 个,但我可以找到以下内容:

亚洲/达卡、亚洲/加尔各答、亚洲/卡拉奇、亚洲/达卡、亚洲/廷布、亚洲/加德满都、亚洲/廷布、亚洲/加尔各答、亚洲/科伦坡、亚洲/加德满都

所有这些时区都使用(或过去曾使用过)+05:30偏移量。由于时区在历史上可能会发生变化,因此在尝试根据偏移量猜测时区时会遇到一些问题:

  • 您需要知道指定日期和时间的当前偏移量是多少。在您的情况下,您正在使用2017-07-30,但我假设您想处理过去的任何日期。
  • 在指定的日期和时间可以有多个具有有效偏移量的时区(然后您必须根据任意条件选择一个)。
  • 根据日期,某些时区可能处于夏令时,这意味着偏移量不会+05:30(或者更糟糕的是,有些可能+05:30在 DST 期间使用)。

因此,根据偏移量,您不能只获得一个时区。您能做的最好的事情是获取候选列表:包含偏移在相应日期/时间有效的所有时区的列表。然后你必须选择其中之一(也许如果你有“首选”列表):

str = '2017-07-30T10:00:00+05:30'
# parse date and get the offset (in this case, +05:30)
d = iso8601.parse_date(str)
offset = d.tzinfo.utcoffset(d)

# a set with all candidate timezones
zones = set()
# find a zone where the offset is valid for the date
for tz in pytz.all_timezones:
    zone = timezone(tz)
    # get the offset for the zone at the specified date/time
    zoneoffset = zone.utcoffset(d.replace(tzinfo=None))
    if (zoneoffset == offset):
        zones.add(zone)

# just checking all the candidates timezones
for z in zones:
    print(z, d.astimezone(z).strftime(fmt))
Run Code Online (Sandbox Code Playgroud)

输出将是:

亚洲/加尔各答 2017-07-30 10:00:00 IST
亚洲/科伦坡 2017-07-30 10:00:00 +0530
亚洲/加尔各答 2017-07-30 10:00:00 IST

请注意,发现了 3 个时区(加尔各答、科伦坡和加尔各答)。那是因为所有这 3 个时区的有效偏移量为+05:30on 2017-07-30。出于某种原因,科伦坡没有被格式化为IST:我认为这取决于这个时区在 Python 中的配置方式,或者我的版本没有更新(我使用的是Python 3.5.2) - 我已经在 J​​ava 中测试过它并且它被格式化as IST,所以可能是我的 Python 安装中的配置问题。

一旦你拥有了所有候选时区,你就必须选择一个(我不确定什么是最好的标准)。

PS:实际上只有2个选项,因为Asia/KolkataAsia/Calcutta是同义词。但是您仍然有不止一种选择,问题仍然存在:选择哪一种?