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]) |
您可以使用
所以,我看到的唯一解决方案是自己拆分日期,删除时区偏移量,将其余的输入到
看看这个问题,在那里您可以找到一些关于如何自己解析偏移量的提示。
以下代码将从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提议的类似策略,您还可以使用
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') |