Python Facebook事件开始时间有时在用户时间,有时在本地事件时间
我正在尝试转换Facebook的开始时间。根据Facebook的文档,Facebook使用ISO-8601字符串来描述精确时间,其格式为UTC的偏移量:Python Facebook事件开始时间有时在用户时间,有时在本地事件时间,python,facebook-graph-api,datetime,timezone,pytz,Python,Facebook Graph Api,Datetime,Timezone,Pytz,我正在尝试转换Facebook的开始时间。根据Facebook的文档,Facebook使用ISO-8601字符串来描述精确时间,其格式为UTC的偏移量: %Y-%m-%dT%H:%M:%S+OFFSET 从API中提取时,一些事件显示为本地时间,例如示例1,其他事件显示为我的用户时间,例如示例2(请注意,事件1和2的位置相同) 例1)eid=1631322720707,开始时间=2013-06-18T22:00:00-0700 例2)eid=59080938485866,开始时间=2013-0
%Y-%m-%dT%H:%M:%S+OFFSET
从API中提取时,一些事件显示为本地时间,例如示例1,其他事件显示为我的用户时间,例如示例2(请注意,事件1和2的位置相同)
例1)eid=1631322720707,开始时间=2013-06-18T22:00:00-0700
例2)eid=59080938485866,开始时间=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
正如您所指出的,由于夏令时的原因,您不能只拥有一个对应于偏移量的城市表。此外,偏移量和时区规则一直在变化。您确实需要一个真正的时区数据库,比如用Python实现的数据库 无法将偏移量(如
-07:00
转换为时区(如美国/丹佛
)。有许多时区共享相同的偏移量,单个时区可以有多个不同的偏移量,具体取决于特定的日期/时间
Facebook为您提供了一个准确的UTC时刻,您可以从中获得准确的UTC时刻。但其中的日期/时间部分应该已经根据事件的当地时间进行了调整。偏移量告诉您它被调整了多少。如果适用,该调整应考虑DST
但是,您说过,对于同一个事件,您将获得两个不同的偏移量?这听起来很奇怪。您是否在facebook api中启用了事件时区设置?这可以在Facebook的高级设置中找到
关于伪代码,是的,这一切都是可行的。也许你想为其他时区调整事件时间,那么这正是你要做的。要知道它不仅仅是一个“城市”。这是IANA命名的时区标识符之一。解释得很好
使现代化
关于您发布的显示您的解决方案的更新,基于我对日期和时间问题的丰富经验,我可以提供以下反馈:
- 除非您实际上是在编写一个专注于解析的库,否则几乎没有任何理由将时间戳的一部分作为子字符串。您应该将其作为一个整体进行解析,并使用该语言或框架提供的各种属性和函数
- 通常不需要使用字符串作为中间步骤,这可能会成为性能瓶颈。在某些语言中,由于区域性/区域或本地时区设置,它可能会引入细微的错误。您从一个
对象开始,希望生成一个datetime
对象,因此所有操作都应该使用datetime
对象和相关函数完成datetime
- Python特别使用了
的“naive”或“aware”值的概念。您的代码以“aware”值开始,但当您调用datetime
时,您正在构建一个“naive”值。因为输入值是“感知的”,所以您可能应该确保输出值也是感知的。有关这方面的更多信息,请阅读本文的前几段strtime
- 你一直说你在寻找城市来解析时区,但你根本没有提到这些数据的来源。您是否手动构建城市和时区表?这种方法可能在您的初始开发和测试期间起作用,但随着时间的推移,您可能会发现它需要大量的维护。世界上有很多城市。他们有时改变名字,有时甚至改变时区。您将不得不处理拼写错误、交替拼写、命名冲突等问题。单独做这件事可能不是个好主意
- 不止一个。如果要尝试从某个位置解析时区,则需要纬度和经度,以及其中之一
- 仅供参考-Python没有自己的时区信息集。
实现了一个公共时区数据库,该数据库由无数研究人员维护多年,通常以其创始人之一的名字命名为“奥尔森”数据库。这是目前由IANA协调,并有它的家。您可以在StackOverflow上或在此处阅读更多信息pytz
- 这些数据一直在变化。当前版本是今年的第三个版本(2013c)。2012年,共发布了10个版本。如果你想保持最新,你需要
- 我还是不认为你需要这些。来自Facebook的事件时间应该已经在正确的本地时间,并显示该本地时间的偏移量。如果您看到应用了错误的偏移,那么可能源数据一开始就错了。事件位置可能是错误的。有一句话,“垃圾进来,垃圾出去”。您可能希望更多地关注确保源数据是正确的,而不是试图“修复”您认为来自Facebook的损坏输出
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