2012-01-27 188 views
3

鉴于datetime.datetime.now(),考虑到闰年,我如何得到本周的周一到周日,然后是去年的同一周一到周日?获取周一和周日以及去年的周一和周日,同一周

我想到的一个想法是获得-365天的timedelta,然后找到最近的星期一或星期天。我确信有更好的方法。

编辑:我不介意使用datetuil,如果在那里有东西会使这更容易。

回答

7

如果使用dateutil是没有问题的,只是用它:)

relativedelta是对象,你需要 在这里你将能够减少一年到当前日期。

NOW = datetime.now() 
last_monday = NOW+relativedelta(years=-1, weekday=MO) 
last_sunday = NOW+relativedelta(years=-1, weekday=SU) 
+0

非常酷。谢谢。 – 2012-01-27 16:57:21

3

如果今年的这个星期一有日期N,同周一去年将有个约会N + 1如果没有年02月29之间,否则去年周一将有个约会N + 2

from datetime import date, timedelta 

today = date.today() 
monday = today - timedelta(today.weekday()) 
sunday = monday + timedelta(6); 
print monday, '-', sunday 

monday_last_year = monday - timedelta(364) # We are trying to go to date N + 1. 
if monday_last_year.weekday() == 1: # It will be either 0 or 1. 
    monday_last_year + timedelta(1) # This is date N + 2. 
sunday_last_year = monday_last_year + timedelta(6) 
print monday_last_year, '-', sunday_last_year 
2
from datetime import date, timedelta 
monday = date.today() - timedelta(days=date.today().weekday()) 
sunday = monday + timedelta(days=6) 

对第二个问题的回答可能取决于什么是“相同的”星期一星期日。我开始与天真的版本和调整,如果它是不正确:

last_year_mon = monday - timedelta(weeks=52) 
last_year_sun = last_year_mon + timedelta(days=6) 
+0

几年有53周,对不对?这很重要吗? – 2012-01-27 16:49:39

0

您可以使用.isocalendar()找回当年周数,然后从那里获得该周的周一/周日当前和前一年。

year, week, _ = datetime.datetime.now().isocalendar() 

然后,使用iso_to_gregorianthis answer

this_sunday = iso_to_gregorian(year, week, 0) 
this_monday = iso_to_gregorian(year, week, 1) 
last_year_sunday = iso_to_gregorian(year - 1, week, 0) 
last_year_monday = iso_to_gregorian(year - 1, week, 1) 
相关问题