strptime默认为1900年。

11
from datetime import datetime

datetime.strptime('%b%d  %I:%M%p', 'AUG21  3:26PM')

results with 
1900-08-21 15:26:00
如何以Pythonic的方式编写代码,使得当没有提供年份时,默认使用当前年份(2013)?我已经检查了strftime函数,没有选项可以更改默认设置。也许其他第三方库可以做到这点?谢谢。

如果您不反对使用第三方库,可以使用dateutil模块。它的parser方法接受一个默认日期,用于填充从解析字符串中缺失的信息。 - SethMMorton
2个回答

7

请按照您已经做的那样解析日期,然后:

date= date.replace(2013)

使用您正在使用的模块之一,这是最简单的解决方案之一。

更好地考虑一下,您可能会在明年2月29日遇到问题。

input= 'Aug21  3:26PM'
output= datetime.datetime.strptime('2013 '+ input ,'%Y %b%d  %I:%M%p')

1
请记住,datetime对象是不可变的,因此在此处进行替换会返回一个新的datetime对象。 - cge
@cge 谢谢你的帮助。我做了一个小改动,现在文本更加清晰了。 - Mario Rossi
我无法针对特定情况来进行黑客攻击。这是一个接收数百个日期时间和格式的函数,并尝试匹配它们的过程。 - eligro
然后修改datetime源代码并重新编译。这是一个旧问题,我不知道其他解决方案。我能想到的唯一替代方案(因为修改库模块绝对太过激烈,我简直不敢相信我刚刚推荐了它 :-))就是检查格式(以及日期)是否带有年份。如果没有,那么你就“黑客”它们。否则,你就让它们保持原样。 - Mario Rossi
@MarioRossi:一个不错的选择是子类化datetime类,并编写一个包装器来调用父strptime,然后在必要时应用默认值。 - cge
@cge: 确实如此,不过一个缺点是对你无法掌控的代码实现细节和内部依赖。换句话说,日期时间的实现者肯定可以随意更改,只要不影响客户端。然而,“客户端”的概念很少包括子类。 - Mario Rossi

1

您可以查找今天的日期以替换年份进行动态替换。

datetime.strptime('%b%d  %I:%M%p', 'AUG21  3:26PM').replace(year=datetime.today().year)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接