关于django:从推特日期到Python日期时间

Going from twitter date to Python datetime date

我正在从Twitter接收在特定日期以以下格式发送的Twitter消息:

1
Tue Mar 29 08:11:25 +0000 2011

我想将这些日期存储在PostgreSQL的"Timestamp with Time Zone"字段和Djangos DateTimeField字段中。但当我存储该字符串时,我会得到以下错误:

1
ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']

我可以自动将twitter日期类型转换为python日期时间(这在我的应用程序的其他地方也适用于保存日期)。


写这样的东西应该将Twitter日期转换为时间戳。

1
2
3
import time

ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))


试试看。它假设Twitter的日期格式符合RFC822(请参见@adrien链接到的问题)。

构造了一个简单的日期时间对象(即没有时区信息)。它根据到UTC的时区偏移量进行调整。除非您需要保留原始时区,否则当您显示日期时间时,我会将其存储为UTC并格式化为本地时间。

1
2
3
4
5
6
7
8
9
from datetime import datetime, timedelta
from email.utils import parsedate_tz

s = 'Tue Mar 29 08:11:25 +0000 2011'

def to_datetime(datestring):
    time_tuple = parsedate_tz(datestring.strip())
    dt = datetime(*time_tuple[:6])
    return dt - timedelta(seconds=time_tuple[-1])


您可以使用datetime.strptime()time.strptime()转换日期。但是,这两个函数无法分析时区偏移量(请参阅此错误)。

所以,我看到的唯一解决方案是自己拆分日期,删除时区偏移量,将其余的输入到strptime(),然后手动处理偏移量…

看看这个问题,在那里您可以找到一些关于如何自己解析偏移量的提示。


以下代码将从Twitter日期(UTC)打印一个好日期(本地时间)。

1
2
3
4
5
from datetime import datetime
from datetime import timezone    

datetime.strptime(mydata["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
            tzinfo=timezone.utc).astimezone(tz=None).strftime('%Y-%m-%d %H:%M:%S'))

这个怎么样?它不需要任何格式字符串。

1
2
3
4
5
6
7
8
9
10
11
import datetime
from email.utils import mktime_tz, parsedate_tz

def parse_datetime(value):
    time_tuple = parsedate_tz(value)
    timestamp = mktime_tz(time_tuple)

    return datetime.datetime.fromtimestamp(timestamp)

print(parse_datetime('Tue Mar 29 08:11:25 +0000 2011'))
#2011-03-29 10:11:25

我的系统是在格林尼治标准时间+2,因此差异包括在内。


在python 3.x中,使用与sofolichon提议的类似策略,您还可以使用pytz,例如:

1
2
3
4
5
6
from datetime import datetime, timezone
import pytz

datetime.strptime(tweets["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
tzinfo=timezone.utc).astimezone(pytz.timezone('US/Eastern')).strftime(
'%Y-%m-%d %H:%M:%S')