根据每周python的星期查找日期

时间:2014-11-21 07:11:49

标签: python datetime

有没有办法在给定年,月,周数(第1,第2,第3等)的特定周内找到日期范围?我已经看到很多关于如何根据具体日期找到周数的答案,但我试图根据周数找到日期。例如,给定(2013年,9年,#34;星期四","第3"),它将给出(2013年,9,19)的结果。

到目前为止,这是我的代码(仅适用于结束于" teenth"的日期):

from datetime import date

def meetupday(year, month, weekday, word):
   weekday_dic = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3,
                "Friday": 4, "Saturday": 5, "Sunday": 6}
   week_of_the_month = {"1st": 1, "2nd": 2, "3rd": 3, "4th": 4, "last": 5}
   if word == "teenth":
      for day in xrange(13, 20):
        if weekday_dic[weekday] == date(year, month, day).weekday():
            return year, month, day
   else:
     for date in xrange(1, amount_of_days+1):
        date_data = datetime.date(year, month, date).isocalendar()
        if date_data[2] == weekday_dic[weekday]+1:
            return year, month, week_of_the_month[word]

这是来自exercism.io的聚会问题。

2 个答案:

答案 0 :(得分:1)

我根据您的给定数据找到日期的解决方案就是这样的

from datetime import datetime, timedelta    
weekday_dic = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3,
                   "Friday": 4, "Saturday": 5, "Sunday": 6}
week_of_the_month = {"1st": 1, "2nd": 2, "3rd": 3, "4th": 4, "last": 5}

start_first_week = first_sunday = datetime(year, month, 1)
while start_first_week.weekday() != weekday_dic[weekday]:
    start_first_week += timedelta(days=1)

start_first_week += timedelta(days=(week_of_the_month[word] - 1) * 7)

我希望能帮到你一点

答案 1 :(得分:1)

我在d.a.d.a的解决方案中找到的一个快速问题是我每年都在计算美国阵亡将士纪念日的日期(5月的最后一个星期一)。我会得到2018-06-04。根据我的参数,这不是正确的月份。如果输出月份与输入不匹配,我添加了快速修复,只需减去7天。我不确定底层问题是什么。现在返回正确答案:2018-05-28。

from datetime import datetime, timedelta    
weekday_dic = {"Monday": 0, "Tuesday": 1, "Wednesday": 2, "Thursday": 3,
                       "Friday": 4, "Saturday": 5, "Sunday": 6}
week_of_the_month = {"1st": 1, "2nd": 2, "3rd": 3, "4th": 4, "last": 5}

start_first_week = first_sunday = datetime(year, month, 1)
while start_first_week.weekday() != weekday_dic[weekday]:
    start_first_week += timedelta(days=1)

start_first_week += timedelta(days=(week_of_the_month[word] - 1) * 7)
if start_first_week.month != month:
    start_first_week += datetime.delta(days=-7)