在python中获取最后一个星期日和星期六的约会

fox*_*fox 17 python datetime date

希望利用datetime获得上周开始和结束的日期,周日至周六.

所以,如果今天是8/12/13,我想定义一个打印的功能:

Last Sunday was 8/4/2013 and last Saturday was 8/10/2013

我该怎么写这个?

编辑:好的,所以似乎有一些关于边缘情况的问题.对于星期六,我想要同一周,除了其他任何事情,我想要紧接着today日期之前的日历周.

fal*_*tru 24

datetime.date.weekday返回0星期一.你需要调整它.

试试以下:

>>> import datetime
>>> today = datetime.date.today()
>>> today
datetime.date(2013, 8, 13)
>>> idx = (today.weekday() + 1) % 7 # MON = 0, SUN = 6 -> SUN = 0 .. SAT = 6
>>> idx
2
>>> sun = today - datetime.timedelta(7+idx)
>>> sat = today - datetime.timedelta(7+idx-6)
>>> 'Last Sunday was {:%m/%d/%Y} and last Saturday was {:%m/%d/%Y}'.format(sun, sat)
'Last Sunday was 08/04/2013 and last Saturday was 08/10/2013'
Run Code Online (Sandbox Code Playgroud)

如果允许使用python-dateutil:

>>> import datetime
>>> from dateutil import relativedelta
>>> today = datetime.datetime.now()
>>> start = today - datetime.timedelta((today.weekday() + 1) % 7)
>>> sat = start + relativedelta.relativedelta(weekday=relativedelta.SA(-1))
>>> sun = sat + relativedelta.relativedelta(weekday=relativedelta.SU(-1))
>>> 'Last Sunday was {:%m/%d/%Y} and last Saturday was {:%m/%d/%Y}'.format(sun, sat)
'Last Sunday was 08/04/2013 and last Saturday was 08/10/2013'
Run Code Online (Sandbox Code Playgroud)

  • 我没有得到“ 7 + 2-6”。您是说`7 + idx-6`吗? (2认同)
  • @jderefinko`isoweekday()`在星期日返回7。 (2认同)
  • @Gi0rgi0s,如果我理解正确的话,OP想要前一周的周日、周六,而不是最后一个周日。 (2认同)

kar*_*eek 8

我发现从最好的答案在这里工作的罚款在我的情况

试试这个

from datetime import datetime,timedelta
import time

def last_day(d, day_name):
    days_of_week = ['sunday','monday','tuesday','wednesday',
                        'thursday','friday','saturday']
    target_day = days_of_week.index(day_name.lower())
    delta_day = target_day - d.isoweekday()
    if delta_day >= 0: delta_day -= 7 # go back 7 days
    return d + timedelta(days=delta_day)
Run Code Online (Sandbox Code Playgroud)


jas*_*son 6

from datetime import date

def satandsun(input):
    d = input.toordinal()
    last = d - 6
    sunday = last - (last % 7)
    saturday = sunday + 6
    print date.fromordinal(sunday)
    print date.fromordinal(saturday)
Run Code Online (Sandbox Code Playgroud)

请注意,这似乎在所有情况下都存在:

>>> satandsun(date(2013, 8, 10))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 11))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 12))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 13))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 14))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 15))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 16))
2013-08-04
2013-08-10
>>> satandsun(date(2013, 8, 17))
2013-08-11
2013-08-17
Run Code Online (Sandbox Code Playgroud)


小智 6

import datetime

d = datetime.datetime.today()    
sat_offset = (d.weekday() - 5) % 7  
saturday = d - datetime.timedelta(days=sat_offset)    
print("Last Saturday was on", saturday)
sun_offset = (d.weekday() - 6) % 7
sunday = d - datetime.timedelta(days=sun_offset)
print("Last Sunday was on", sunday)
Run Code Online (Sandbox Code Playgroud)


Rob*_*obᵩ 5

>>> today = date.today().toordinal()
>>> lastWeek = today-7
>>> sunday = lastWeek - (lastWeek % 7)
>>> saturday = sunday + 6
>>> print "Last Sunday was %s and last Saturday was %s" % (date.fromordinal(sunday), date.fromordinal(saturday))
Last Sunday was 2013-08-04 and last Saturday was 2013-08-10
Run Code Online (Sandbox Code Playgroud)


joz*_*ozo 5

当我处理这个问题时,我提出了这个解决方案:

from datetime import datetime, timedelta

def prior_week_end():
    return datetime.now() - timedelta(days=((datetime.now().isoweekday() + 1) % 7))

def prior_week_start():
    return prior_week_end() - timedelta(days=6)
Run Code Online (Sandbox Code Playgroud)

因此 OP 可以将其用作:

'Last Sunday was {:%m/%d/%Y} and last Saturday was {:%m/%d/%Y}'.format(prior_week_start(), prior_week_end())
Run Code Online (Sandbox Code Playgroud)