我正在尝试转换 Facebook start_time 的时间。根据 Facebook 的文档,Facebook 使用 ISO-8601 字符串来描述与 UTC 格式的偏移量的精确时间:
%Y-%m-%dT%H:%M:%S+OFFSET
在从 API 中提取时,一些事件以本地时间出现,例如示例 1,而其他事件以我的用户时间出现,例如示例 2(请注意,事件 1 和 2 的位置相同)。
示例 1) eid = 163113227202707, start_time = 2013-06-18T22:00:00-0700
示例 2) eid = 590809384285866, start_time = 2013-06-17T01:00:00-0300
我需要使用本地活动时间,包括夏令时。
我开始为大约 1500 个城市创建一个表格,格式如下:
city timezone dst offset
Abidjan GMT +0000
Abuja WAT +0100
Accra GMT +0000
Adama EAT +0300
Addis Ababa EAT +0300
Agadez WAT +0100
Agadir WEST DST +0100
Al Jizah EET +0200
Alexandria EET +0200
Algiers CET +0100
Ali Sabieh EAT +0300
Antananarivo EAT +0300
Antsirabe EAT +0300
Arusha EAT +0300
Asmara EAT +0300
Bafatá GMT +0000
Bamako GMT +0000
Bambari WAT +0100
Bamenda WAT +0100
Bangui WAT +0100
Banjul GMT +0000
Bata WAT +0100
Beira CAT +0200
Benghazi CST DST +0200
Benin City WAT +0100
Berbérati WAT +0100
但是,由于这是静态的,因此对夏令时没有帮助。
在阅读有关 pytz 的文档时,我不确定如何根据城市名称查询时区。这甚至可能吗?
本质上,我正在尝试创建以下伪代码:
start_time = 2013-06-17T01:00:00-0300
UTC_start_time = normalize_time_to_UTC(start_time)
offset = lookup_offset_given_city_and_UTC(city, UTC)
local_start_time(UTC_start_time, offset)
更新:
我首先通过解析字符串来根据 Facebook 提供的偏移量对时间进行标准化,如下所示:
def fql_local_time_to_utc(start_time):
if len(fql_timestamp) < 20:
return fql_timestamp
else:
timestamp = fql_timestamp[:19]
sign = fql_timestamp[19]
hours = fql_timestamp[20:22]
minutes = fql_timestamp[22:24]
offset = int(hours)+int(minutes)/60
if sign =="+":
offset = -offset
timestamp_object = datetime.datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S')
utc_object = timestamp_object + datetime.timedelta(hours = offset)
return utc_object
接下来,我查找场地 ID 的 location_city 并尝试在上面的数据库中匹配它,我手动添加了一个名为“pytz_timezone_name”的列。通过连接查询找到相关时区后,我应用以下代码。
try:
tz = db.fetchone()["pytz_timezone_name"]
tz_object = timezone(tz)
local_event_time = timezone('UTC').localize(utc_time).astimezone(tz_object)
local_time = local_event_time.strftime('%Y-%m-%dT%H:%M:%S%z')
except:
local_time = start_time