Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Facebook事件开始时间有时在用户时间,有时在本地事件时间_Python_Facebook Graph Api_Datetime_Timezone_Pytz - Fatal编程技术网

Python Facebook事件开始时间有时在用户时间,有时在本地事件时间

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

我正在尝试转换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-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特别使用了
    datetime
    的“naive”或“aware”值的概念。您的代码以“aware”值开始,但当您调用
    strtime
    时,您正在构建一个“naive”值。因为输入值是“感知的”,所以您可能应该确保输出值也是感知的。有关这方面的更多信息,请阅读本文的前几段

  • 你一直说你在寻找城市来解析时区,但你根本没有提到这些数据的来源。您是否手动构建城市和时区表?这种方法可能在您的初始开发和测试期间起作用,但随着时间的推移,您可能会发现它需要大量的维护。世界上有很多城市。他们有时改变名字,有时甚至改变时区。您将不得不处理拼写错误、交替拼写、命名冲突等问题。单独做这件事可能不是个好主意

  • 不止一个。如果要尝试从某个位置解析时区,则需要纬度和经度,以及其中之一

  • 仅供参考-Python没有自己的时区信息集。
    pytz
    实现了一个公共时区数据库,该数据库由无数研究人员维护多年,通常以其创始人之一的名字命名为“奥尔森”数据库。这是目前由IANA协调,并有它的家。您可以在StackOverflow上或在此处阅读更多信息

  • 这些数据一直在变化。当前版本是今年的第三个版本(2013c)。2012年,共发布了10个版本。如果你想保持最新,你需要

  • 我还是不认为你需要这些。来自Facebook的事件时间应该已经在正确的本地时间,并显示该本地时间的偏移量。如果您看到应用了错误的偏移,那么可能源数据一开始就错了。事件位置可能是错误的。有一句话,“垃圾进来,垃圾出去”。您可能希望更多地关注确保源数据是正确的,而不是试图“修复”您认为来自Facebook的损坏输出


感谢您的回复。我确实启用了事件时区,并且我已经多次看到这种行为。我目前正在进行一项工作,涉及手动创建的pytz时区和城市词典。我是一个新手程序员,但是时区是非常不友好的。是的,它们可以是不友好的
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