Python datetime.strptime 月份说明符似乎无效

3 投票
3 回答
1866 浏览
提问于 2025-04-16 13:21

月份格式的说明似乎不太好用。

from datetime import datetime
endDate = datetime.strptime('10 3 2011', '%j %m %Y')
print endDate
2011-01-10 00:00:00 
endDate = datetime.strptime('21 5 1987', '%j %m %Y')
print endDate 
1987-01-21 00:00:00

根据手册的说明,手册上说:

%m = 以十进制数字表示的月份 [01,12]。

那么,我到底漏掉了什么呢?除了因为想搞明白为什么我的django __filter查询什么都不返回而抓狂(输入的日期不合法!)之外,我还试过 0305,结果也没用。

关于版本、平台、架构等信息:

$ python --version
Python 2.7
$ python3 --version
Python 3.1.2
$ uname -r
2.6.35.11-83.fc14.x86_64 (that's Linux/Fedora 14/64-bit).

3 个回答

2

%j 是用来表示一年中的第几天的。比如说,1月10号是这一年的第10天,而3月份是不会有第10天的,所以你指定的月份被忽略了。简单来说,就是输入的数据不正确,输出的结果也不会对。

3

难道%j不是“一年中的第几天”的格式吗?这可能会让strptime选择1月21日,忽略%m的规则吗?

6

你不能把 %j 和其他格式代码像 %m 混在一起使用,因为如果你查看你链接的表格,%j 表示一年中的第几天,以十进制数字表示 [001,366],所以 10 对应的是一年中的第 10 天,也就是 1 月 10 日……

所以你只需要写:

>>> datetime.strptime('10 2011', '%j %Y')
datetime.datetime(2011, 1, 10, 0, 0)

如果你想把 10 当作这个月的第几天来用,你应该这样做:

>>> datetime.strptime('10 3 2011', '%d %m %Y')
datetime.datetime(2011, 3, 10, 0, 0)

撰写回答