如何使用 %p 将包含 AM/PM 的字符串转换为 python 中的日期时间

How to convert string containing AM/PM to datetime in python using %p

我需要转换一个格式为 '2000-01-01 12:00:00 AM' 的字符串,但不管是上午还是下午,结果都是一样的(见下面的例子)。

from datetime import datetime
frmt = '%Y-%d-%m %H:%M:%S %p'
datetime.strptime('2000-01-01 12:00:00 AM', frmt).isoformat()
datetime.strptime('2000-01-01 12:00:00 PM', frmt).isoformat()

输出为:

'2000-01-01T12:00:00'
'2000-01-01T12:00:00'

我认为如果 12AM 是午夜或中午,这可能是一个与没有定义相关的问题,但即使在其他不同时间执行相同的代码,结果仍然相同:

datetime.strptime('2000-01-01 06:00:00 AM', frmt).isoformat()
datetime.strptime('2000-01-01 06:00:00 PM', frmt).isoformat()

输出为:

'2000-01-01T06:00:00'
'2000-01-01T06:00:00'

strftime.org 网站说我使用的格式应该有效,但实际上无效。我该怎么办?

你可以使用dateutil.parser.parse to parse any datetime string without providing a format string, this is available in the dateutil模块

In [22]: from dateutil import parser                                                                                                                                                   

In [25]: parser.parse('2000-01-01 12:00:00 PM').isoformat()                                                                                                                            
Out[25]: '2000-01-01T12:00:00'

In [26]: parser.parse('2000-01-01 12:00:00 AM').isoformat()                                                                                                                            
Out[26]: '2000-01-01T00:00:00'

这就是我使用箭头的原因。只是让这一切变得更容易。

import arrow
frmt = 'YYYY-MM-DD HH:mm:ss A'
print(arrow.get('2000-01-01 12:00:00 AM', frmt))
print(arrow.get('2000-01-01 12:00:00 PM', frmt))
#datetime
print(arrow.get('2000-01-01 12:00:00 AM', frmt).datetime)
print(arrow.get('2000-01-01 12:00:00 PM', frmt).datetime)
#isoformat
print(arrow.get('2000-01-01 12:00:00 AM', frmt).isoformat())
print(arrow.get('2000-01-01 12:00:00 PM', frmt).isoformat())