如何使用Python根据当前日期查找上周一的日期?我想也许我可以使用:datetime.weekday()
做到这一点,但是我陷入了困境。
我基本上想找到今天的日期和星期一的日期,以使用构造一个django中的日期范围查询created__range=(start_date, end_date)
。
Answers:
>>> import datetime
>>> today = datetime.date.today()
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1)
datetime.date(2009, 10, 26)
一些解释:
以今天的日期。减去本周已经过去的天数(这使您成为“上一个”星期一)。加一个星期。
编辑:以上是“下周一”的内容,但是由于您正在寻找“上周一”,因此可以使用
today - datetime.timedelta(days=today.weekday())
new DateTime("last monday")
或strtotime("last monday")
。
strtotime("last monday", strtotime("2018-03-14"))
,但是我不想讨论哪种语言更好。所有语言都有其缺点和优点。
ChristopheD的职位接近您想要的职位。我没有足够的代表发表评论:(
而不是(实际上会给您下一个下周一):
>>>今天+ datetime.timedelta(天= -today.weekday(),周= 1) datetime.date(2009,10,26)
我会说:
>>> last_monday =今天-datetime.timedelta(days = today.weekday())
如果需要上一周,请添加“ weeks = 1”参数。
由于您要减去时间增量,因此这使代码更具可读性。这消除了由于添加具有负偏移量和正偏移量的timedelta引起的任何混乱。
>>> from datetime import date, timedelta >>> today = date(2020, 4, 6) >>> today - timedelta(days=today.weekday()) datetime.date(2020, 4, 6) >>>
我认为最简单的方法是使用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
注意:OP在评论中说:“我正在寻找过去的星期一”。我认为这意味着我们正在寻找严格在今天之前发生的最后一个星期一。
仅使用datetime
模块很难正确地进行计算(特别是上面给出的“过去星期一”的解释,如果您希望避免笨拙的话if-statements
)。例如,如果today
是星期一,例如2013-12-23
,
today - DT.timedelta(days=today.weekday())
返回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
请注意,days=-1
必须保证past_monday
与的日期不同today
。
您可以使用Natty。我尝试了parsedatetime和dateparser。比较这三个,我认为纳蒂是最好的之一。
要获得结果,请使用以下方法:
>>> 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
试试看,它可以做更多!
对于将来出现在此页面上的Google员工,他们寻求一种获取“最近的星期日”而不是“最近的星期一”的方法,则需要做一些额外的数学运算,因为datetime.weekday()将星期一视为第一天一周中的:
today = datetime.date.today()
weekday = today.weekday() + 1
start_day = today - datetime.timedelta(days=weekday % 7)
如果今天是星期二,则设置start_day
为最后一个星期日。如果今天是星期天,则设置start_day
为今天。拿走% 7
,如果你想“的最后一个星期日”是一个星期前,如果它是目前星期天。