从周数获取日期

4 投票
1 回答
1666 浏览
提问于 2025-04-18 18:20

我想根据周数来获取一个日期,但遇到了一些麻烦。

date.weekday() 这个方法会返回星期几,其中0代表星期一,6代表星期天。

date.strftime()date.strptime() 中的 %w 指令则是把0当作星期天,6当作星期六。

这就导致了在根据 date.weekday() 得到的周数来算日期时,出现了一些非常烦人的问题。

有没有更好的方法可以根据周数来获取日期呢?

编辑:

我添加了一个例子。

import datetime

original_date = datetime.date(2014, 8, 24)
week_of_the_date = original_date.isocalendar()[1] # 34
day_of_the_date = original_date.isocalendar()[2] # 7
temp = '{0} {1} {2}'.format(*(2014, week_of_the_date, day_of_the_date-1))
date_from_week = datetime.datetime.strptime(temp, '%Y %W %w')
week_from_new_date = date_from_week.isocalendar()[1] # 35!!

编辑 2:
最后我把日期的相关内容放在了视图中(使用 jQuery UI),这样对周的理解更加一致。

1 个回答

2

我觉得在使用 weekdaystrftime 时,关于周日和周一的区别其实没什么大不了的。你可以用 isoweekday 来让它们对齐,或者如果你想把周日当作一周的第一天,可以在 strftime 中使用 %U。真正的问题是,strftime 这个函数(它是基于C语言的一个函数)对一年第一周的定义和ISO标准是不一样的。根据 %W 的说明:“新年里在第一个周一之前的所有天都被认为是第0周”。而ISO日历则是把包含第一个星期四的那一周视为第一周,具体原因我也不太明白。

我找到两种方法来处理ISO周,既可以返回 datetime.date 实例,也支持多种操作,分别是:

  1. 一种简单的 timedelta 方法,具体可以参考这个回答:如何找到 datetime.isocalendar() 的反向操作?
  2. 还有一个第三方库:https://pypi.python.org/pypi/isoweek/

撰写回答