datetime.datetime.strptime似乎强制指令匹配,无论使用的实际字符串长度如何。通过使用较短的字符串,伪指令将强制datetime.datetime对象在字符串中使用“ something”,而与实际伪指令无关。
这是正确的行为,具有足够的输入来填充指令
>>> datetime.datetime.strptime('20180822163014', '%Y%m%d%H%M%S')
datetime.datetime(2018, 8, 22, 16, 30, 14)
该指令将更改先前的解析
>>> datetime.datetime.strptime('20180822163014', '%Y%m%d%H%M%S%f')
datetime.datetime(2018, 8, 22, 16, 30, 1, 400000)
如果输入字符串不够长,有没有办法丢弃最右边的指令,而不是蚕食左边的指令?
我已经标记了C和ubuntu,因为文档说
”支持的全套格式代码在不同平台上有所不同, 因为Python调用了平台C库的strftime()函数,并且 平台变体很常见。查看完整的格式代码 在您的平台上受支持,请查阅strftime(3)文档。”
编辑:
man ctime
显示以下结构作为输出。有趣的是,似乎不支持微秒(%f)的精度。
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
答案 0 :(得分:0)
嗯,我想您必须自己做,这似乎并不困难,因为您知道这种模式。 这样的事情应该工作
pattern = ""
if len(s) == 0: raise Exception "empty time string"
if len(s) <= 4: pattern += "%Y"
... # as many if as you need here
datetime.datetime.strptime(s, pattern)
如果您使用长日期模式,这会很痛苦,但是我怀疑datetime模块中已经有某些功能在执行它-因为它只是与C的绑定。
您可以尝试做一些更通用的事情,并询问是否可以将其添加到datetime模块中。