python 中人类可读的时区?
Human readable timezone in python?
如何从 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>)
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')
您可以使用 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))
两种情况的输出是:
2017-07-30 10:00:00 IST
请注意,我使用 Asia/Kolkata
而不是 IST
。那是因为这三个字母的名称是 ambiguous and not standard: IST
can be India Standard Time, Israel Standard Time or Irish Standard Time(最后一个也称为 爱尔兰夏令时,因为它是爱尔兰夏令时使用的时区)。
总是喜欢使用 IANA timezones names (always in the format Continent/City
, like America/Sao_Paulo
or Europe/Berlin
). If Asia/Kolkata
is not what you need, check this list 来找到最适合您的情况。
如果你不知道使用哪个时区,想根据偏移量来猜测,恐怕没那么简单。
以您的输入为例:偏移量为 +05:30
(比 UTC 早 5 小时 30 分钟)。有 more than one timezone 使用此偏移量(或在其历史记录中使用过一次)。维基百科 link 包含 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
(或者更糟的是,有些时区可能在 DST 期间使用 +05:30
) .
因此,您不能根据偏移量只获得一个时区。您能做的最好的事情就是获得 候选者 的列表:一个包含所有时区的列表,其中偏移量在各自的 date/time 有效。然后你必须选择其中之一(也许如果你有 "prefered ones" 的列表):
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))
输出将是:
Asia/Kolkata 2017-07-30 10:00:00 IST
Asia/Colombo 2017-07-30 10:00:00 +0530
Asia/Calcutta 2017-07-30 10:00:00 IST
请注意,找到了 3 个时区(加尔各答、科伦坡和加尔各答)。那是因为所有这 3 个时区在 2017-07-30
上都有 +05:30
的有效偏移量。出于某种原因,Colombo 未被格式化为 IST
:我认为这取决于 Python 中时区的配置方式,或者我的版本未更新(我正在使用 Python 3.5.2) - 我已经在 Java 中对此进行了测试,它的格式为 IST
,所以这可能是我的 Python 安装中的配置问题。
获得所有候选时区后,您必须选择一个(我不确定什么是最佳标准)。
PS:其实只有2个选项,因为Asia/Kolkata
和Asia/Calcutta
是同义词。但是您仍然有不止一种选择,问题仍然存在:选择哪一种?
如何从 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>)
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')
您可以使用 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))
两种情况的输出是:
2017-07-30 10:00:00 IST
请注意,我使用 Asia/Kolkata
而不是 IST
。那是因为这三个字母的名称是 ambiguous and not standard: IST
can be India Standard Time, Israel Standard Time or Irish Standard Time(最后一个也称为 爱尔兰夏令时,因为它是爱尔兰夏令时使用的时区)。
总是喜欢使用 IANA timezones names (always in the format Continent/City
, like America/Sao_Paulo
or Europe/Berlin
). If Asia/Kolkata
is not what you need, check this list 来找到最适合您的情况。
如果你不知道使用哪个时区,想根据偏移量来猜测,恐怕没那么简单。
以您的输入为例:偏移量为 +05:30
(比 UTC 早 5 小时 30 分钟)。有 more than one timezone 使用此偏移量(或在其历史记录中使用过一次)。维基百科 link 包含 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
(或者更糟的是,有些时区可能在 DST 期间使用+05:30
) .
因此,您不能根据偏移量只获得一个时区。您能做的最好的事情就是获得 候选者 的列表:一个包含所有时区的列表,其中偏移量在各自的 date/time 有效。然后你必须选择其中之一(也许如果你有 "prefered ones" 的列表):
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))
输出将是:
Asia/Kolkata 2017-07-30 10:00:00 IST
Asia/Colombo 2017-07-30 10:00:00 +0530
Asia/Calcutta 2017-07-30 10:00:00 IST
请注意,找到了 3 个时区(加尔各答、科伦坡和加尔各答)。那是因为所有这 3 个时区在 2017-07-30
上都有 +05:30
的有效偏移量。出于某种原因,Colombo 未被格式化为 IST
:我认为这取决于 Python 中时区的配置方式,或者我的版本未更新(我正在使用 Python 3.5.2) - 我已经在 Java 中对此进行了测试,它的格式为 IST
,所以这可能是我的 Python 安装中的配置问题。
获得所有候选时区后,您必须选择一个(我不确定什么是最佳标准)。
PS:其实只有2个选项,因为Asia/Kolkata
和Asia/Calcutta
是同义词。但是您仍然有不止一种选择,问题仍然存在:选择哪一种?