【问题标题】:How to get last Friday?上周五怎么去?
【发布时间】:2012-10-02 08:37:48
【问题描述】:

下面的代码应该在上周五 16:00:00 返回。但它返回Friday of previous week。如何解决?

now = datetime.datetime.now()
test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4, weeks=-1))
test = test.replace(hour=16,minute=0,second=0,microsecond=0)

更新。我现在使用以下方法 - 这是最好的方法吗?

now = datetime.datetime.now()
if datetime.datetime.now().weekday() > 4:
    test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4))
else:
    test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4, weeks=-1))
test = test.replace(hour=16,minute=0,second=0,microsecond=0)

更新2。只是举个例子。假设今天是 2012 年 10 月 5 日。如果当前时间等于或小于 16:00,则应返回 2012 年 9 月 28 日,否则 - 2012 年 10 月 5 日

【问题讨论】:

  • 圣蟹块。拆分你的代码!
  • @LA_ 如果今天是星期五,你希望它如何工作?
  • @bohney,取决于时间。如果 16:00 已经过去,那么应该是今天。否则 - 上一周的星期五。

标签: python datetime


【解决方案1】:

dateutil library 非常适合这样的事情:

>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta, FR
>>> datetime.now() + relativedelta(weekday=FR(-1))
datetime.datetime(2012, 9, 28, 9, 42, 48, 156867)

【讨论】:

  • 这个解决方案很好。您只需要为一天中的时间添加 .replace 调用。
  • @LA_ 真可惜 - 不知道 GAE 是一个约束
  • 我觉得可以单独安装。但宁愿在没有 3rd 方库的情况下这样做。无论如何,感谢您的帮助。
  • 如果当天是星期五,如何通过此代码获取上周五?
  • @Americancurl 你可以做 min(mon-1day-relativedelta(weekday=MO(-1)), mon-relativedelta(weekday=MO(-1))
【解决方案2】:

在链接的问题中,您需要使用datetime.date 对象而不是datetime.datetime。最后要得到datetime.datetime,可以使用datetime.datetime.combine()

import datetime

current_time = datetime.datetime.now()

# get friday, one week ago, at 16 o'clock
last_friday = (current_time.date()
    - datetime.timedelta(days=current_time.weekday())
    + datetime.timedelta(days=4, weeks=-1))
last_friday_at_16 = datetime.datetime.combine(last_friday, datetime.time(16))

# if today is also friday, and after 16 o'clock, change to the current date
one_week = datetime.timedelta(weeks=1)
if current_time - last_friday_at_16 >= one_week:
    last_friday_at_16 += one_week

【讨论】:

  • 看起来如果今天是 2012 年 10 月 6 日,您的代码将返回 9 月 28 日,而预计是 10 月 5 日。
  • 谢谢。下次我必须清楚地解释我需要什么...您在 2012 年 10 月 5 日的代码将始终返回 2012 年 9 月 28 日。但如果当前时间等于或小于 16:00,它应该返回 2012 年 9 月 28 日,否则 - 2012 年 10 月 5 日。
【解决方案3】:

无依赖的最简单解决方案:

from datetime import datetime, timedelta

def get_last_friday():
    now = datetime.now()
    closest_friday = now + timedelta(days=(4 - now.weekday()))
    return (closest_friday if closest_friday < now
            else closest_friday - timedelta(days=7))

【讨论】:

    【解决方案4】:

    这是从 Jon Clements 那里借来的,但这是完整的解决方案:

    >>> from datetime import datetime
    >>> from dateutil.relativedelta import relativedelta, FR
    >>> lastFriday = datetime.now() + relativedelta(weekday=FR(-1))
    >>> lastFriday.replace(hour=16,minute=0,second=0,microsecond=0)
    datetime.datetime(2012, 9, 28, 16, 0, 0, 0)
    

    【讨论】:

      【解决方案5】:

      原理同your other question

      获取当前一周的星期五,如果晚了,则减去一周。

      import datetime
      from datetime import timedelta
      now = datetime.datetime.now()
      today = now.replace(hour=16,minute=0,second=0,microsecond=0)
      sow = (today - datetime.timedelta(days=now.weekday()))
      this_friday = sow + timedelta(days=4)
      if now > this_friday:
           test = this_friday
      else:
           test = this_friday + timedelta(weeks=-1)
      

      【讨论】:

      • 在这个答案中,我想来自 Fr。 16:00:01 开始,您想要本周的日期时间。
      【解决方案6】:

      可能很蹩脚,但对我来说最简单。获取当前月份的最后一天并开始检查周五的循环(因为在找到上周五之前的最大循环数为 7,因此不会花费任何费用)。如果最后一天不是星期五递减和前一天的检查。

      import calendar
      from datetime import datetime, date
      
      def main():
          year = datetime.today().year    
          month = datetime.today().month  
          x = calendar.monthrange(year,month)
          lastday = x[1]
          while True:
              z = calendar.weekday(year, month, lastday)
              if z != 4:
                  lastday -= 1
              else:
                  print(date(year,month,lastday))
                  break
      
      if __name__ == "__main__":
          main()
      

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        • 2021-06-11
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多