2

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

#!/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() 和 SetTimeZone(),但我无法弄清楚它们是如何工作的。

还研究了如何在 python 中将日期时间对象移动 12 小时,但不确定我是否需要去那里。

谢谢你的帮助!

4

2 回答 2

2

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

不幸的是,用户的time_zone属性不是 tz 使用的标准tz 数据库格式pytz,因此有必要使用utc_offsetuser 属性(我们仍然使用该time_zone属性来命名tzinfo带有 UTC 偏移量的 created )。该python-dateutil包提供了一种方便的类型tzoffset,允许tzinfo从 UTC 偏移量创建实例,然后我们可以使用它来将datetimeUTC 转换为本地时区:

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
于 2012-10-28T18:42:44.390 回答
1

结合 Pedro Romano 和 JF 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。

谢谢!

于 2012-10-29T02:20:01.213 回答