在Google App Engine上使用小数秒的字符串到日期时间

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支持令人惊讶的各种可能的输入格式,它无需模式字符串即可解析这些格式。

  • *“在现代”*, `datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")` 按原样工作。 (6认同)