【问题标题】:get the last sunday and saturday's date in python在python中获取最后一个星期日和星期六的日期
【发布时间】:2022-04-12 20:06:48
【问题描述】:

希望利用 datetime 获取上一周的开始和结束日期,即周日到周六。

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

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

我该如何写这篇文章?

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

【问题讨论】:

  • 为什么上周日是 2013 年 8 月 4 日而不是 2013 年 8 月 11 日?请准确地指定您想要的行为。
  • 我试过搞乱timedelta,但我无法得到正确的偏移量。
  • 请不要使用诸如“last”之类的模棱两可的英文单词来说明这一点。你需要 100% 清楚。我的意思是,你有没有在你的生活中进行过“派对是下一个星期五的形式的对话?” “现在是星期一,你是说四天后,还是十一天后?”
  • 如果是 8 月 12 日,我要求 8/48/10 应该清楚我要的是什么。
  • 哦,我明白了,OP 假设星期天是一周的第一天?

标签: python date datetime


【解决方案1】:

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'

如果你被允许使用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'

【讨论】:

  • 使用 datetime 的 isoweekday() 而不是 weekday() 来获取标准的工作日数字(0 代表星期日,1 代表星期一,等等)
  • @jderefinko isoweekday() 周日返回 7。
  • today = datetime.date(2019, 6, 29) 返回上周日的2019-06-16,它应该是2019-06-23
  • @Gi0rgi0s,如果我理解正确的话,OP 想要星期天,前一周的星期六,而不是最后一个星期日。
  • 如果要上周日和上周六,则将 relativedelta.SA(-1) 更改为 relativedelta.SA(0) 并将 relativedelta.SU(-1) 更改为 relativedelta.SU(0)) @ falsetru - 我认为这是一个绝妙的解决方案
【解决方案2】:

我从here 找到了最佳答案,在我的情况下工作正常

试试这个

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)

【讨论】:

  • 不幸的是,链接已关闭,但这里有一个示例调用:last_day(datetime.today(), 'sunday')
  • @kartheek 你能详细说明这些论点是什么吗?链接失效了?
【解决方案3】:
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)

请注意,这似乎适用于您的所有案例:

>>> 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

【讨论】:

    【解决方案4】:
    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)
    

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 这不符合 2013 年 8 月 10 日的 OP 规范。
      • 是的,故意的。这是一个愚蠢的规格。 OP 真正想要的(与他要求的不同)是前一周的开始和结束。如果当前时间是周六上午 11:30,他的奇数附录需要当前周,而不是周。
      【解决方案6】:

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

      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)
      

      所以 OP 可以将其用作:

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

      【讨论】:

        【解决方案7】:

        以下代码对我有用:

            today = datetime.date.today()
            last_sunday_offset = today.weekday() + 1  # convert day format mon-sun=0-6 => sun-sat=0-6 
            last_sunday = today - datetime.timedelta(days=last_sunday_offset)
        

        注意:以上我采用了正常工作日(星期一为 0),但在 isoweekday 中,星期一为 1。 更多详情可以查看python内置包datetime.pyweekday()和isoweekday()方法:

            def weekday(self):
                "Return day of the week, where Monday == 0 ... Sunday == 6."
                return (self.toordinal() + 6) % 7
        
            # Day-of-the-week and week-of-the-year, according to ISO
        
            def isoweekday(self):
                "Return day of the week, where Monday == 1 ... Sunday == 7."
                # 1-Jan-0001 is a Monday
                return self.toordinal() % 7 or 7```
        

        【讨论】:

          【解决方案8】:

          这就是我所做的:

          import datetime
          
          
          def what_date_was_last(day_of_the_week):
              today = datetime.date.today()
          
              last_seven_dates_from_yesterday = {}
              mod_count = -1
              for i in range(7):
                  tdelta = datetime.timedelta(mod_count)
                  mod_count -= 1
                  date = today + tdelta
                  last_seven_dates_from_yesterday[date.weekday()] = date
          
              days_of_the_week_dict = {
                  "mon": 0,
                  "tue": 1,
                  "wed": 2,
                  "thu": 3,
                  "fri": 4,
                  "sat": 5,
                  "sun": 6,
              }       
              answer=last_seven_dates_from_yesterday
                   [days_of_the_week_dict[day_of_the_week]]
              return answer
          

          所以现在我可以跑了..

          what_date_was_last("sun")
          

          或一周中的任何一天

          what_date_was_last("tue")
          

          【讨论】:

            【解决方案9】:

            最简单的方法是:

            import datetime
            
            today = datetime.datetime.now(datetime.timezone.utc)
            last_sat = today - datetime.timedelta(days=today.weekday()+2)
            last_sun = today - datetime.timedelta(days=today.weekday()+1)
            

            今天设置为 UTC,请随意使用您喜欢的方式。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-12
              • 2021-09-27
              • 1970-01-01
              • 1970-01-01
              • 2019-04-08
              • 2014-06-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多