python中人类可读的时区?

时间:2017-06-28 09:24:50

标签: python-3.x datetime timezone localtime

如何在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>)

2 个答案:

答案 0 :(得分:2)

您可以使用iso8601dateutil.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))

两种情况的输出是:

  

2017-07-30 10:00:00 IST

请注意,我使用的是Asia/Kolkata而不是IST。这是因为这些3个字母的名称是ambiguous and not standardIST可以是India Standard TimeIsrael Standard TimeIrish Standard Time(最后一个也称为爱尔兰夏天时间,因为它是爱尔兰夏令时期间使用的时区。

始终更喜欢使用IANA timezones names(始终采用Continent/City格式,例如America/Sao_PauloEurope/Berlin)。如果Asia/Kolkata不是您所需要的,请查看this list以找到最适合您情况的那个。

如果您不知道要使用哪个时区并想根据偏移量进行猜测,恐怕就不那么简单了。

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

  

Asia / Dhaka,Asia / Calcutta,Asia / Karachi,Asia / Dacca,Asia / Thimbu,Asia / Katmandu,Asia / Thimphu,Asia / Kolkata,Asia / Colombo,Asia / Kathmandu

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

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

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

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

输出将是:

  

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

注意发现了3个时区(加尔各答,科伦坡和加尔各答)。这是因为所有这3个时区在+05:30上的有效偏移量为2017-07-30。出于某种原因,Colombo未格式化为IST:我认为这取决于如何在Python中配置此时区,或者我的版本未更新(我使用的是 Python 3.5.2 ) - 我在Java中对它进行了测试,并将其格式化为IST,因此可能是我的Python安装中的配置问题。

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

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

答案 1 :(得分:0)

import time,datetime,os
localtime = time.asctime( time.localtime(time.time()) )
print ("Local current time :", localtime)  #This is localtime

os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'  #Here u need to specify what might be #the timezone
time.tzset()
print time.strftime('%X %x %Z')