比较两个日期时间字符串

Comparing two datetime strings

我有两个 DateTime 字符串。我如何比较它们并判断哪个在前?

A = '2019-02-12 15:01:45:145'
B = '2019-02-12 15:02:02:22'

如果两个 date/time 字符串都是 ISO 8601 格式 (YYYY-MM-DD hh:mm:ss),您可以使用简单的字符串比较来比较它们,如下所示:

a = '2019-02-12 15:01:45.145'
b = '2019-02-12 15:02:02.022'

if a < b:
    print('Time a comes before b.')
else:
    print('Time a does not come before b.')

但是,您的字符串有一个额外的“:”,之后是……毫秒?我不确定。但是如果你把它们转换成标准的 hh:mm:ss.xxx... 形式,那么你的日期字符串自然就具有可比性了。


如果没有办法改变您接收 hh:mm:ss:xx 格式的字符串这一事实(我假设 xx 是毫秒,但只有您可以肯定地说) ,然后您可以通过解析最后的“:xx”并将其重新附加为“.xxx”来稍微“修改”字符串,如下所示:

def mungeTimeString(timeString):
    """Converts a time string in "YYYY-MM-DD hh:mm:ss:xx" format
       to a time string in "YYYY-MM-DD hh:mm:ss.xxx" format."""
    head, _, tail = timeString.rpartition(':')
    return '{}.{:03d}'.format(head, int(tail))

然后调用它:

a = '2019-02-12 15:01:45:145'
b = '2019-02-12 15:02:02:22'

a = mungeTimeString(a)
b = mungeTimeString(b)

if a < b:
    print('Time a comes before b.')
else:
    print('Time a does not come before b.')

这种格式有毫秒,所以time.strptime无法解析。我选择按照最后一个冒号拆分,解析左边部分,手动转换右边部分,加在一起。

A = '2019-02-12 15:01:45:145'
B = '2019-02-12 15:02:02:22'

import time

def parse_date(s):
    date,millis = s.rsplit(":",1)
    return time.mktime(time.strptime(date,"%Y-%m-%d %H:%M:%S")) + int(millis)/1000.0

print(parse_date(A))
print(parse_date(B))

打印:

1549958505.145
1549958522.022

现在比较结果而不是打印它们以获得您想要的结果

如果您对毫秒的约定不同(例如:这里的 22 也可能表示 220),那么它会略有不同。右边补零,然后解析:

def parse_date(s):
    date,millis = s.rsplit(":",1)
    millis = millis+"0"*(3-len(millis))   # pad with zeroes
    return time.mktime(time.strptime(date,"%Y-%m-%d %H:%M:%S")) + int(millis)/1000.0

在那种情况下,结果是:

1549958505.145
1549958522.22