【问题标题】:Find next date by day of week [duplicate]按星期几查找下一个日期[重复]
【发布时间】:2013-03-23 03:58:23
【问题描述】:

我正在使用“日期时间”,但无法弄清楚如何按星期几以“%Y-%M-%d”格式获取日期。例如:

由于今天是 2013 年 4 月 1 日(星期一),那么什么代码会抓取下一个星期二或星期四? (输出应该是 2013-04-02 - 星期二)

或者如果日期是 2013 年 4 月 2 日,星期二,那么下一个星期一、星期三或星期五的代码会是什么? (输出应该是 2013-04-03 - 第二天或星期三)

谢谢,

【问题讨论】:

  • 这与 Python 或其日期和时间模块无关。你需要编写一个算法来计算这个。
  • 感谢您向我展示了 weekday() 方法。这就是我需要的!

标签: python datetime


【解决方案1】:

你可以试试这样的:

from datetime import datetime
from datetime import timedelta

def return_next_tues_thur(dt):
    while True:
        dt += timedelta(days=1)
        dow = dt.strftime(%w)
        if dow == 2 || dow == 4:
           return dt

dt = datetime.now()  # Or you set it: dt = datetime(2013, 4, 1)
next_tues_thur = return_next_tues_thur(dt)
print next_tues_thur.strftime("%Y-%m-%d")

这使用strftime 方法和%w 修饰符从datetime 对象获取星期几。 (%w 将返回 0 到 6 范围内的 int,其中 0 是星期日。)

这个想法应该很容易扩展到周一/周三/周五。

【讨论】:

    【解决方案2】:

    这行得通:

    import datetime as dt
    
    dow={d:i for i,d in 
             enumerate('Mon,Tue,Wed,Thu,Fri,Sat,Sun'.split(','))}
    
    def next_dow(d,day):
        while d.weekday()!=day:
            d+=dt.timedelta(1)
    
        return d   
    
    d1=min(next_dow(dt.datetime(2013,4,1),day) 
                     for day in (dow['Tue'],dow['Thu']))   
    d2=min(next_dow(dt.datetime(2013,4,2),day) 
                     for day in (dow['Mon'],dow['Wed'],dow['Fri'])) 
    
    for d in d1,d2:
        print d.strftime('%Y-%m-%d') 
    

    或者(也许更好但不太通用):

    def next_dow(d,days):
        while d.weekday() not in days:
            d+=dt.timedelta(1)
    
        return d   
    
    d1=next_dow(dt.datetime(2013,4,1),(dow['Tue'],dow['Thu']))
    d2=next_dow(dt.datetime(2013,4,2),(dow['Mon'],dow['Wed'],dow['Fri']))
    
    for d in d1,d2:
        print d.strftime('%Y-%m-%d') 
    

    打印:

    2013-04-02 
    2013-04-03 
    

    【讨论】:

    • 谢谢!这是一个美妙的回应。 weekday() 函数的有趣用法。谢谢,学到了很多。
    猜你喜欢
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2019-06-09
    相关资源
    最近更新 更多