代码之家  ›  专栏  ›  技术社区  ›  Eric

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

  •  1
  • Eric  · 技术社区  · 6 年前

    无论实际使用的字符串长度是多少,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 将以下结构显示为输出。有趣的是,微秒的精度似乎不受支持。

    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 回复  |  直到 6 年前
        1
  •  0
  •   Maxime Flin    6 年前

    好吧,我想你必须自己做,这似乎并不难,因为你知道模式。 像这样的事情对工作来说应该是

    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)
    

    如果您有long date模式,编写它会非常痛苦,但我怀疑datetime模块中已经有一些函数在执行此操作,因为它只是与C的绑定。

    您可以尝试执行更通用的操作,并询问是否可以将其添加到datetime模块。