【问题标题】:Using python-twitter library, how to set timezone?使用 python-twitter 库,如何设置时区?
【发布时间】:2012-10-18 04:14:55
【问题描述】:

我正在尝试列出带有时间戳的推文。我有这个...

#!/usr/bin/python
import twitter
api = twitter.Api()
statuses = api.GetUserTimeline('ttytter')
for s in statuses:
  print s.created_at + " " + s.text

打印出来的...

Sat Oct 20 04:56:47 +0000 2012 @uriel1998 W/r/t DMs, they appear just fine in 2.0.4 and 2.1 beta here, near as I can tell.

这几乎是我所追求的,但就目前而言,这似乎是在错误的时区。 https://twitter.com/ttytter/status/259518502069760000

有没有办法可以在 python-twitter 库中更改它?我正在查看GetTimeZone() and SetTimeZone(),但我无法弄清楚它们是如何工作的。

也在看how to shift a datetime object by 12 hours in python,但不确定我是否需要去那里。

感谢您的帮助!

【问题讨论】:

  • 你想把UTC时间转换成推文的作者时区还是你当地的时区?
  • 在这种情况下,它们是相同的,我可以手动设置。不过,如果它使用作者的时区,可能会是一个更好的脚本。
  • 如果它不是问题的一部分,那么您可以发布代码作为答案,以允许独立投票、评论、小修复,如果它是问题的一部分,则不适合,例如 @987654326 @ 在我的代码中代表斯德哥尔摩时区,它可以替换为 la_tzuser_tzlocal_tz 任何更适合您的情况(st_dt 相同)
  • 好的,把它作为自己的答案。感谢您指出您正在使用的变量约定。我将相应地编辑我的代码。

标签: python twitter timezone python-twitter


【解决方案1】:

python-twitter 将状态时间戳作为字符串和自纪元以来的秒数返回。后者是最简单的转换为时区感知的datetime 实例(参见answer)。

很遗憾用户的time_zone属性不是pytz使用的标准tz database格式,所以需要改用utc_offset用户属性(我们还是用time_zone属性来命名tzinfo 使用 UTC 偏移量创建)。 python-dateutil 包提供了一个方便的类型 tzoffset,它允许从 UTC 偏移量创建 tzinfo 实例,然后我们可以使用它来将 datetime 从 UTC 转换为本地时区:

import pytz
import twitter

from datetime import  datetime
from dateutil.tz import tzoffset

USERNAME = 'ttytter'

api = twitter.Api()

# get a 'tzinfo' instance with the UTC offset for the user's local time
user = api.GetUser(USERNAME)
localtime_tz = tzoffset(user.time_zone, user.utc_offset)

statuses = api.GetUserTimeline(USERNAME)
for s in statuses[:1]:
    # get UTC timestamp from seconds since epoch
    utc_dt = datetime.utcfromtimestamp(s.created_at_in_seconds).replace(tzinfo=pytz.utc)
    print('utc: {}'.format(utc_dt))
    # convert to local time in the user's timezone
    localtime_dt = utc_dt.astimezone(localtime_tz)
    print('localtime [{}]: {}'.format(localtime_dt.tzname(), localtime_dt))

给出第一个状态的输出:

utc: 2012-10-20 04:56:47+00:00
localtime [Pacific Time (US & Canada)]: 2012-10-19 20:56:47-08:00

【讨论】:

  • 你不需要dateutil。 python-twitter 提供created_at_in_seconds,您可以使用the pytz example I've linked above 将其转换为给定时区的时间。
  • 你是绝对正确的@J.F.Sebastian。谢谢。修改答案。
  • 基于 dateutil.tzoffset 的代码如何解释 DST 转换?
  • @J.F.Sebastian:它没有。我只是假设 Twitter 计算了本地时区和时间戳的正确 UTC 偏移量,并考虑了任何 DST 转换。我宁愿只使用pytz,但我们如何才能从UTC 偏移量中获得pytz 时区? time_zone 属性没有用,因为它不包含正确的奥尔森时区名称。
  • 感谢佩德罗和 J.F.!通过结合你的答案,我得到了我所追求的。
【解决方案2】:

结合 Pedro Romano 和 J.F. Sebastian 的建议,我有这个...

import pytz
import twitter

from datetime import  datetime

USERNAME = 'ttytter'

api = twitter.Api()

user = api.GetUser(USERNAME)
pst_tz = pytz.timezone('America/Los_Angeles')

statuses = api.GetUserTimeline(USERNAME)
for s in statuses[:1]:
    # get UTC timestamp from seconds since epoch
    utc_dt = datetime.utcfromtimestamp(s.created_at_in_seconds).replace(tzinfo=pytz.utc)
    # convert to given timezone
    pst_dt = pst_tz.normalize(utc_dt.astimezone(st_tz))
    print(pst_dt.strftime('%Y-%m-%d %H:%M:%S ')) + s.text

输出:2012-10-19 21:56:47 @uriel1998 W/r/t DMs, they appear just fine in 2.0.4 and 2.1 beta here, near as I can tell.,这是正确的时区,也考虑了 DST。

谢谢!

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 2014-07-19
    • 1970-01-01
    • 2022-12-12
    • 2011-12-05
    • 1970-01-01
    • 2018-08-30
    • 2016-02-02
    • 1970-01-01
    相关资源
    最近更新 更多