用Python查找星期一的日期

Joe*_*Joe 58 python django

如何根据使用Python的当前日期找到上周一的日期?我想也许我可以使用:datetime.weekday()做到这一点,但我卡住了.

我基本上想找到今天的日期和星期一日期,使用以下方法在django中构建日期范围查询:created__range=(start_date, end_date).

Chr*_*heD 148

>>> import datetime
>>> today = datetime.date.today()
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)
Run Code Online (Sandbox Code Playgroud)

一些解释的话:

以今天为准.减去本周已经过去的天数(这会让你"上次"星期一).加一周.

编辑:上面是'下周一',但是因为你正在寻找'最后一个星期一'你可以使用

today - datetime.timedelta(days=today.weekday())
Run Code Online (Sandbox Code Playgroud)

  • Python非常棒:)在大多数其他语言中,这很难并且非常重要. (10认同)
  • @BallpointBen 例如:`strtotime("last monday", strtotime("2018-03-14"))`,但我不想讨论哪种语言更好。所有语言都有其缺点和优点。 (3认同)
  • 实际上并没有回答上周一而不是下周一的问题 (2认同)
  • @GeraldKaszuba实际上它在PHP中更容易和更易读:`new DateTime("last monday")`或`strtotime("last monday")`. (2认同)

Ste*_*ham 39

ChristopheD的帖子接近你想要的.我没有足够的代表发表评论:(

而不是(实际上给你下一个即将到来的星期一):

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

我会说:

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

如果您想要前一周,请添加'weeks = 1'参数.

这使得代码更具可读性,因为您正在减去timedelta.这清除了由于添加具有负偏移和正偏移的timedelta而导致的任何混淆.

  • 哇哦,我现在可以评论了!谢谢. (4认同)

die*_*us9 20

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

from datetime import date
from dateutil.relativedelta import relativedelta, MO

today = date.today()
last_monday = today + relativedelta(weekday=MO(-1))
print last_monday
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 8

注意:OP在评论中说," 我在寻找过去的星期一 ".我认为这意味着我们正在寻找在今天之前发生的最后一个星期一.

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

today - DT.timedelta(days=today.weekday())
Run Code Online (Sandbox Code Playgroud)

返回2013-12-23,与today(不是过去的星期一)同一天.

使用dateutil模块的优点是您不必进行棘手的心理计算,也不必强迫读者做同样的事情以获得正确的日期.dateutil为你做的一切:

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
Run Code Online (Sandbox Code Playgroud)

请注意,days=-1需要保证past_monday与其不同的一天today.


cor*_*ror 8

对于未来出现在此页面上寻找获取“最近的星期日”而不是“最近的星期一”的方法的 Google 用户,您需要做一些额外的数学运算,因为 datetime.weekday() 将星期一视为第一天一周中的:

today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)
Run Code Online (Sandbox Code Playgroud)

如果今天是星期二,则设置start_day为上星期日。如果今天是星期日,则设置start_day今天% 7如果您希望“上周日”是一周前(如果当前是周日),请去掉“上周日”。