在Python中将其他时间值转换为datetime格式

EGr*_*EGr 2 python time compare module date

我有一次显示为:

2012-11-12 15:16:08.648521
Run Code Online (Sandbox Code Playgroud)

另一个时间显示为:

14:44:02 Mon Nov 12 2012
Run Code Online (Sandbox Code Playgroud)

有没有办法将第二次格式转换为第一次格式的格式(例如,2012年11月12日星期一14:44:02成为2012-11-12 14:44:02.?????)?我需要比较第二个日期(从日志中提取)到另一个日期,以确认我收到了正确的文件.

aba*_*ert 6

看看datetime.datetime.strptime.

您只需要为每种格式编写格式规范,将这两个值转换为datetime对象,然后进行比较.(您可以将一种字符串格式转换为另一种字符串格式并比较字符串,但这并不像想法那么好,我将在下面解释.)

例如:

>>> import datetime
>>> fmt1 = '%Y-%m-%d %H:%M:%S.%f'
>>> fmt2 = '%H:%M:%S %a %b %d %Y'
>>> s1 = '2012-11-12 15:16:08.648521'
>>> s2 = '14:44:02 Mon Nov 12 2012'
>>> dt1 = datetime.datetime.strptime(s1, fmt1)
>>> dt2 = datetime.datetime.strptime(s2, fmt2)
>>> cmp(dt1, dt2)
1
>>> dt1
datetime.datetime(2012, 11, 12, 15, 16, 8, 648521)
>>> dt2
datetime.datetime(2012, 11, 12, 14, 44, 2)
Run Code Online (Sandbox Code Playgroud)

请注意,您的一种时间格式包括微秒而另一种不包含,这意味着如果第一个恰好恰好位于第二个标记(以...结尾.000000),它们实际上只会相等.如何处理这取决于你想要做什么.

例如,如果要舍入到最接近的秒,可以执行以下操作:

dt1 = datetime.datetime(dt1.year, dt1.month, dt1.day, 
                        dt1.hour, dt1.minute, 
                        dt1.second + (1 if dt1.microsecond >= 500000 else 0), 0)
Run Code Online (Sandbox Code Playgroud)

或者,如果要检查某个增量范围内的相等性:

abs(dt2 - dt1) < datetime.timedelta(0, 1)
Run Code Online (Sandbox Code Playgroud)

您可能遇到的另一个问题是时区.如果其中一个日期是本地日期,另一个日期是GMT,则必须在解析后转换其中一个日期.

您的原始问题是询问如何将一种格式转换为另一种格式.您可以这样做,然后将它们作为字符串进行比较,但将它们作为实际datetime值进行比较要好得多.一方面,如果他们两个转换为第二格式,他们甚至不恰当地比较作为字符串(14:44:02 Mon Nov 12 2012小于15:44:02 Sun Nov 11 2012即使它的23个小时后).它还使处理微秒,时区等更加复杂.但如果你真的想这样做,strftime那么相反的功能是strptime:

>>> datetime.datetime.strftime(dt2, fmt1)
'2012-11-12 14:44:02.00000'
Run Code Online (Sandbox Code Playgroud)