查找星期一';用Python进行约会

查找星期一';用Python进行约会,python,django,Python,Django,如何使用Python根据当前日期查找上一个星期一的日期?我想也许我可以用:datetime.weekday()来做,但是我被卡住了 我基本上希望找到今天的日期和星期一的日期,以便在django中使用:created\uu range=(start\u date,end\u date)构造一个日期范围查询 一些解释: 以今天的日期为例。减去本周已经过去的天数(即“最后一个”星期一)。加上一周 编辑:以上是“下周一”,但由于您正在寻找“上周一”,您可以使用 today - datetime.time

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

我基本上希望找到今天的日期和星期一的日期,以便在django中使用:
created\uu range=(start\u date,end\u date)
构造一个日期范围查询

一些解释:

以今天的日期为例。减去本周已经过去的天数(即“最后一个”星期一)。加上一周

编辑:以上是“下周一”,但由于您正在寻找“上周一”,您可以使用

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

使用TimeDelta和datetime模块:

import datetime
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday())
提供一周中的今天,从0(星期一)到6(星期日)


(7-d)%7给你几天到星期一的时间,或者如果今天是星期一,就把你留在原地。

注意:OP在评论中说,“我在寻找过去的星期一”。我认为这意味着我们在寻找严格意义上发生在今天之前的最后一个星期一

仅使用
datetime
模块(特别是考虑到上面对“过去的星期一”的解释,并且如果您希望避免笨重的
if语句
),计算就有点困难。例如,如果今天是星期一,例如2013-12-23

today - DT.timedelta(days=today.weekday())
返回
2013-12-23
,该日期与
今天的日期相同(不是过去的星期一)

使用的优点是,你不必做复杂的心理计算,也不必强迫读者做同样的事情来获得正确的日期
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

请注意,
days=-1
是保证过去的周一
与今天不同的一天

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

>>>today+datetime.timedelta(天=-today.weekday(),周=1) 日期时间。日期(2009年10月26日) 我想说:

>>> last_monday = today - datetime.timedelta(days=today.weekday()) >>>last_monday=today-datetime.timedelta(days=today.weekday()) 如果要查看前一周,请添加“weeks=1”参数


这会使代码更可读,因为您要减去一个timedelta。这会清除由于添加具有负偏移量和正偏移量的timedelta而引起的任何混淆。

我认为最简单的方法是这样使用:

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

today = date.today()
last_monday = today + relativedelta(weekday=MO(-1))
print last_monday
>>> 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

你可以使用Natty。我试过parsedatetime和dateparser。比较这三个,我认为Natty是最好的

要获得结果,请使用以下命令:

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

today = date.today()
last_monday = today + relativedelta(weekday=MO(-1))
print last_monday
>>> 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链接:


试试看,它可以做得更多!

对于未来出现在本页上寻找“最近的星期日”而不是“最近的星期一”的Google用户,您需要做一些额外的计算,因为datetime。weekday()将星期一视为一周的第一天:

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

如果今天是星期二,则将
start\u day
设置为最后一个星期日。如果今天是星期日,则将
start\u day
设置为今天。如果您想要“最后一个星期日”,请删除
%7
如果现在是星期天,则为一周前。

即将到来的星期一还是过去的星期一?我正在寻找过去的星期一Whooooooo,我现在可以发表评论!谢谢。上述查找上星期一的解决方案可能不适用于所有情况。下面的示例:
>>from datetime import date,timedelta>>今天=日期(2020,4,6)>>今天-timedelta(days=today.weekday())datetime.date(2020,4,6)>>>>
Python真是太棒了:)这在大多数其他语言中都是困难且不平凡的。实际上并没有回答上周一而不是下周一的问题monday@GeraldKaszuba实际上,它在PHP中更容易阅读:
newdatetime(“上周一”)
strottime(“上周一”)
@JustAC0der您如何获得任意日期之前的最后一个周一,而不是今天?@BallpointBen例如:
strotime(“上周一”,strotime(“2018-03-14”))
,但我不想讨论哪种语言更好。所有语言都有各自的缺点和优点。您正在艰难地使用简易工具;)
>>> 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
today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)