jbe*_*net 14 python google-app-engine datetime
我需要将一个字符串转换为一个日期时间对象,以及小数秒.我遇到了各种各样的问题.
通常,我会这样做:
>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")
Run Code Online (Sandbox Code Playgroud)
但错误和旧文档告诉我python2.5的strptime没有%f ...
进一步调查,似乎App Engine的数据存储不喜欢小数秒.在编辑数据存储区实体时,尝试将.5添加到datetime字段会给出以下错误:
ValueError: unconverted data remains: .5
Run Code Online (Sandbox Code Playgroud)
我怀疑不支持小数秒......所以这只是在数据存储区查看器上,对吧?
有没有人绕过这个问题?我想使用本机日期时间对象...我宁愿不存储UNIX时间戳...
谢谢!
编辑:感谢Jacob Oscarson的.replace(...)提示!
要记住的一件事是在喂入之前检查nofrag的长度.不同的来源使用不同的精度秒.
对于那些寻找类似内容的人来说,这是一个快速功能:
def strptime(val):
if '.' not in val:
return datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S")
nofrag, frag = val.split(".")
date = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
frag = frag[:6] # truncate to microseconds
frag += (6 - len(frag)) * '0' # add 0s
return date.replace(microsecond=int(frag))
Run Code Online (Sandbox Code Playgroud)
Jac*_*son 12
解析
如果没有%f格式支持,datetime.datetime.strptime()你仍然可以很容易地将它输入一个datetime.datetime对象(随机选择你的值val),使用datetime.datetime.replace()),在2.5.5上测试:
>>> val = '2010-08-06T10:00:14.143896'
>>> nofrag, frag = val.split('.')
>>> nofrag_dt = datetime.datetime.strptime(nofrag, "%Y-%m-%dT%H:%M:%S")
>>> dt = nofrag_dt.replace(microsecond=int(frag))
>>> dt
datetime.datetime(2010, 8, 6, 10, 0, 14, 143896)
Run Code Online (Sandbox Code Playgroud)
现在你有了自己的datetime.datetime对象.
存储
进一步阅读http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime
我可以看到没有提到不支持分数,所以是的,它可能只是数据存储区查看器.文档直接指向Python 2.5.2的模块文档datetime,它支持分数,而不是%f解析指令strptime.查询分数可能比较棘手,但..
小智 5
到目前为止,所有古代历史,但在现代,您也可以方便地使用 dateutil
from dateutil import parser as DUp
funky_time_str = "1/1/2011 12:51:00.0123 AM"
foo = DUp.parse(funky_time_str)
print foo.timetuple()
# time.struct_time(tm_year=2011, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=51, tm_sec=0, tm_wday=5, tm_yday=1, tm_isdst=-1)
print foo.microsecond
# 12300
print foo
# 2011-01-01 00:51:00.012300
Run Code Online (Sandbox Code Playgroud)
dateutil支持令人惊讶的各种可能的输入格式,它无需模式字符串即可解析这些格式。