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

时间:2010-08-04 18:18:36

标签: python google-app-engine datetime

我需要将字符串转换为datetime对象,以及小数秒。我遇到了各种各样的问题。

通常,我会这样做:

>>> datetime.datetime.strptime(val, "%Y-%m-%dT%H:%M:%S.%f")

但错误和旧文档告诉我python2.5的strptime没有%f ...

进一步调查,似乎App Engine的数据存储不喜欢小数秒。在编辑数据存储区实体时,尝试将.5添加到datetime字段会给出以下错误:

ValueError: unconverted data remains: .5

我怀疑不支持小数秒......所以这只是在数据存储区查看器上,对吗?

有没有人绕过这个问题?我想使用本机日期时间对象...我宁愿不存储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))

2 个答案:

答案 0 :(得分:11)

<强>解析

如果没有%f格式支持datetime.datetime.strptime(),您仍然可以使用{{datetime.datetime对象(在此处随机选择val的值)轻松输入1}}),在2.5.5上测试:

datetime.datetime.replace()

现在你有>>> 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) 个对象。

<强>存储

进一步阅读http://code.google.com/appengine/docs/python/datastore/typesandpropertyclasses.html#datetime

我可以看到没有提到不支持分数,所以是的,它可能只是数据存储区查看器。文档直接指向Python 2.5.2的datetime.datetime模块文档,它支持分数,而不支持datetime的{​​{1}}解析指令。然而,查询分数可能会更棘手......

答案 1 :(得分:3)

现在所有的古代历史,但在这些现代,你也可以方便地使用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

dateutil支持各种可能的输入格式,它在没有模式字符串的情况下解析。