在pytz中创建新时区

2 投票
1 回答
2370 浏览
提问于 2025-05-01 15:16

我想创建一个时区对象,表示“GMT+01”,但是我找不到用pytz来实现的方法。我试着用一些网站上说在这个时区的城市(http://wwp.greenwichmeantime.com/time-zone/gmt-plus-1/),但它们的结果看起来都很奇怪,而且不一致(这些结果是相对于地方平均时间LMT的)。

>>> timezone('Africa/Algiers')
<DstTzInfo 'Africa/Algiers' PMT+0:09:00 STD>
>>> timezone('Africa/Brazzaville')
<DstTzInfo 'Africa/Brazzaville' LMT+1:01:00 STD>
>>> timezone('Africa/Conakry')
<DstTzInfo 'Africa/Conakry' LMT-1 day, 23:05:00 STD>
>>> timezone('Africa/Douala')
<DstTzInfo 'Africa/Douala' LMT+0:39:00 STD>

有没有人知道怎么创建一个自定义的“GMT+01”时区,或者说创建一个相对于“GMT”时区的?我试过加一个datetime.timedelta,但显然这样是行不通的。

暂无标签

1 个回答

1

你可以使用 pytz 来选择时区,然后尝试处理字符串,从 datetime 中提取出相对于格林威治标准时间(GMT)的时间。接着,你可以选择只显示 GMT+x 的时间,在你的情况下,就是 GMT+1

import pytz

from datetime import tzinfo, timedelta, datetime

GMT_1_Time_Zone = []
for tz in pytz.common_timezones:
    now = datetime.now(pytz.timezone(tz))
    print now
    if "+0100" in now.strftime("%z"):
        GMT_1_Time_Zone.append((tz, "(GMT%s) %s" % (now.strftime("%z"), tz)))


print GMT_1_Time_Zone

输出结果:

[('Africa/Algiers', '(GMT+0100) Africa/Algiers'), ('Africa/Bangui', '(GMT+0100) Africa/Bangui'), ('Africa/Brazzaville', '(GMT+0100) Africa/Brazzaville'), ('Africa/Ceuta', '(GMT+0100) Africa/Ceuta'), ('Africa/Douala', '(GMT+0100) Africa/Douala'), ('Africa/Kinshasa', '(GMT+0100) Africa/Kinshasa'), ('Africa/Lagos', '(GMT+0100) Africa/Lagos'), ('Africa/Libreville', '(GMT+0100) Africa/Libreville'), ('Africa/Luanda', '(GMT+0100) Africa/Luanda'), ('Africa/Malabo', '(GMT+0100) Africa/Malabo'), ('Africa/Ndjamena', '(GMT+0100) Africa/Ndjamena'), ('Africa/Niamey', '(GMT+0100) Africa/Niamey'), ('Africa/Porto-Novo', '(GMT+0100) Africa/Porto-Novo'), ('Africa/Tripoli', '(GMT+0100) Africa/Tripoli'), ('Africa/Tunis', '(GMT+0100) Africa/Tunis'), ('Arctic/Longyearbyen', '(GMT+0100) Arctic/Longyearbyen'), ('Europe/Amsterdam', '(GMT+0100) Europe/Amsterdam'), ('Europe/Andorra', '(GMT+0100) Europe/Andorra'), ('Europe/Belgrade', '(GMT+0100) Europe/Belgrade'), ('Europe/Berlin', '(GMT+0100) Europe/Berlin'), ('Europe/Bratislava', '(GMT+0100) Europe/Bratislava'), ('Europe/Brussels', '(GMT+0100) Europe/Brussels'), ('Europe/Budapest', '(GMT+0100) Europe/Budapest'), ('Europe/Busingen', '(GMT+0100) Europe/Busingen'), ('Europe/Copenhagen', '(GMT+0100) Europe/Copenhagen'), ('Europe/Gibraltar', '(GMT+0100) Europe/Gibraltar'), ('Europe/Ljubljana', '(GMT+0100) Europe/Ljubljana'), ('Europe/Luxembourg', '(GMT+0100) Europe/Luxembourg'), ('Europe/Madrid', '(GMT+0100) Europe/Madrid'), ('Europe/Malta', '(GMT+0100) Europe/Malta'), ('Europe/Monaco', '(GMT+0100) Europe/Monaco'), ('Europe/Oslo', '(GMT+0100) Europe/Oslo'), ('Europe/Paris', '(GMT+0100) Europe/Paris'), ('Europe/Podgorica', '(GMT+0100) Europe/Podgorica'), ('Europe/Prague', '(GMT+0100) Europe/Prague'), ('Europe/Rome', '(GMT+0100) Europe/Rome'), ('Europe/San_Marino', '(GMT+0100) Europe/San_Marino'), ('Europe/Sarajevo', '(GMT+0100) Europe/Sarajevo'), ('Europe/Skopje', '(GMT+0100) Europe/Skopje'), ('Europe/Stockholm', '(GMT+0100) Europe/Stockholm'), ('Europe/Tirane', '(GMT+0100) Europe/Tirane'), ('Europe/Vaduz', '(GMT+0100) Europe/Vaduz'), ('Europe/Vatican', '(GMT+0100) Europe/Vatican'), ('Europe/Vienna', '(GMT+0100) Europe/Vienna'), ('Europe/Warsaw', '(GMT+0100) Europe/Warsaw'), ('Europe/Zagreb', '(GMT+0100) Europe/Zagreb'), ('Europe/Zurich', '(GMT+0100) Europe/Zurich')]

更新

在深入研究这个问题后,我发现了两个更好的解决方案。

from dateutil import tz
import datetime
import pytz

from datetime import datetime
dt = datetime.strptime("2014-11-02 21:00:00", "%Y-%m-%d %H:%M:%S")
dt = pytz.timezone('Etc/GMT+1').localize(dt)
dt.isoformat()
print dt

使用 parser

from dateutil.parser import parse
dt = parse("2014-11-02 21:00:00" + "GMT+0100")
dt.isoformat()
print dt

撰写回答