使用可变的输入长度的datetime.datetime.strptime()

时间:2018-10-13 19:03:49

标签: python c datetime ubuntu

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 */
};

1 个答案:

答案 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模块中。