Python 2.7 是Python';s`datetime.strtime`buggy表示53周年份的周数?

Python 2.7 是Python';s`datetime.strtime`buggy表示53周年份的周数?,python-2.7,python-datetime,Python 2.7,Python Datetime,我正在使用Python2.7,我正在尝试将周数转换为实际日期 我使用的解决方案在基础测试中效果很好,但我发现了一个似乎有中断的案例:在53周的时间里 下面的示例显示了该问题: datetime.datetime.strptime( "2015-W53-0", "%Y-W%W-%w").strftime("%Y-W%W-%w") 这将返回'2016-W01-0',我认为这没有意义 这是一个已知的问题,是否有已知的解决方法 请注意: datetime.datetime.strptime( "201

我正在使用Python2.7,我正在尝试将周数转换为实际日期

我使用的解决方案在基础测试中效果很好,但我发现了一个似乎有中断的案例:在53周的时间里

下面的示例显示了该问题:

datetime.datetime.strptime( "2015-W53-0", "%Y-W%W-%w").strftime("%Y-W%W-%w")
这将返回
'2016-W01-0'
,我认为这没有意义

这是一个已知的问题,是否有已知的解决方法

请注意:

datetime.datetime.strptime( "2015-W53-0", "%Y-W%W-%w").isocalendar()

收益率
(2016,1,7)
,因此这里的猜测可能是错误的
strtime

%W是一年中的一周,第一周包含一个星期一,计算为第1周

一周的第一天是星期一,它的%w天数为1。一周的最后一天是星期日,其日数为0。因此,在此计算中,%Y-%W-0总是比%Y-%W-1晚六天到达

根据这种计算,第52周从12月28日开始,不包括星期日。因此,2015-W52-0被解释为2016年的第一个星期日(1月3日)。由于这是在第一个星期一之前,2015-W52-0通常是2016-W00-0,2015-W53-0是2016年的第二个星期日,即1月10日,即2016-W01-0

因此,这些方法正在发挥作用

%W和%W未实现ISO周日期算法,该算法将第一周设置为包含星期四的周。2015年是ISO法的第53周,但不是%W法。如果要使用ISO工作日,应使用
isocalendar


由于python的标准实现只是调用C库函数,因此根据ISO算法,您可以使用%G(年份)和%V(周数)。但是这些不能保证是可移植的。

事实上,我找到了一个很好的库,名为,正如我所期望的那样工作

#This is Week 53 of 2015 according to ISO
week = isoweek.Week.withdate( datetime.date( 2016,1,1) )
monday = week.monday()
print monday.isocalendar()
#Prints (2015, 53, 1), which is correct.

我认为这是处理这些问题的最简单方法。

这很有效,感谢您发布解决方案。你可以接受你自己对这个问题的回答。很遗憾,
strtime
不支持James K提到的ISO日期的
%G
%V
(至少在Python 3.5.2中不支持)。