关于django:用Python查找星期一的约会

Find Monday's date with Python

如何使用python根据当前日期查找上一个星期一的日期?我想也许我可以用:datetime.weekday()来做,但我被卡住了。

我基本上想找到今天的日期和周一的日期,用:created__range=(start_date, end_date)在django中构造一个日期范围查询。


1
2
3
4
>>> import datetime
>>> today = datetime.date.today()
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)

一些解释:

今天的约会。减去本周已经过去的天数(这将使您"上一个"星期一)。增加一周。

编辑:上面是"下星期一",但是既然你在找"上星期一",你可以用

1
today - datetime.timedelta(days=today.weekday())


克里斯托夫的职位接近你想要的。我没有足够的代表发表评论:(

而不是(实际上是下一个星期一):

1
2
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)

我会说:

1
>>> last_monday = today - datetime.timedelta(days=today.weekday())

如果需要上一周,请添加"weeks=1"参数。

这使得代码更加可读,因为您要减去一个时间增量。这可以清除添加具有负偏移量和正偏移量的时间增量所导致的任何混乱。


我认为最简单的方法是像这样使用python-dateutil:

1
2
3
4
5
6
from datetime import date
from dateutil.relativedelta import relativedelta, MO

today = date.today()
last_monday = today + relativedelta(weekday=MO(-1))
print last_monday

注:运营商在评论中说,"我在寻找过去的周一"。我认为这意味着我们正在寻找严格发生在今天之前的最后一个星期一。

仅使用datetime模块(特别是考虑到上述对"过去星期一"的解释,如果您希望避免笨重的if-statements模块),计算有点困难。例如,如果today是星期一,如2013-12-23

1
today - DT.timedelta(days=today.weekday())

返回2013-12-23,与today同一天(不是上周一)。

使用dateutil模块的好处是,您不必进行复杂的心理计算,也不必强迫读者做同样的事情来获得正确的日期。dateutil为您做了一切:

1
2
3
4
5
6
7
8
9
10
11
12
import dateutil.relativedelta as rdelta
import datetime as DT

today = DT.date(2013, 12, 23)  # Monday

past_monday = today + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1))
print(past_monday)
# 2013-12-16

next_monday = today + rdelta.relativedelta(days=1, weekday=rdelta.MO(+1))
print(next_monday)
# 2013-12-30

注意,需要days=-1来保证past_mondaytoday不同。


对于未来出现在该页面上的谷歌用户,如果想找到一种方法来获取"最近的星期日",而不是"最近的星期一",则需要进行一些额外的计算,因为datetime.week day()将星期一视为一周的第一天:

1
2
3
today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)

如果今天是星期二,这将使start_day变为上星期日。如果今天是星期天,这就把start_day设为今天。如果你想"上星期日"是一周前,如果现在是星期日,就把它拿走。


你可以用Natty。我尝试了parsedatetime和dateparser。比较这三个,我认为纳蒂是最好的。

要获得结果,请按如下方式使用:

1
2
3
4
>>> from natty import DateParser
>>> dp = DateParser('last monday')
>>> dp.result()
[datetime.datetime(2016, 8, 1, 17, 35, 5, tzinfo=tzlocal())] #Today is 9th of August 2016 5.35 PM

github链接:https://github.com/eadmundo/python-natty

试试看,它能做得更多!


使用TimeDelta和日期时间模块:

1
2
import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())

1
d = datetime.datetime.today().weekday()

给您一周中的今天,从0(星期一)到6(星期日)计数

1
datetime.datetime.today() + datetime.timedelta(days=(7-d)%7)

(7-D)%7给您星期一之前的天数,如果今天是星期一,则离开您所在的位置