0

以下代码获取日期参数的星期开始:

weekstart = datetime.datetime.strptime(sys.argv[1], '%m/%d/%Y')

if weekstart.strftime('%A') != 'Sunday':
    print "Start date should be a Sunday"
    while weekstart.strftime('%A') != 'Sunday':
        #weekstart = weekstart - datetime.timedelta(a)
        a=a+1
    print "Using %s as start date instead" %weekstart.strftime('%m/%d/%Y')

仅当输入的日期为 2012 年 7 月 10 日、2012 年 7 月 11 日、2012 年 7 月 12 日或 2012 年 7 月 13 日时,我才会收到以下错误:

while weekstart.strftime('%A') != 'Sunday':

ValueError: year=1899 is before 1900; the datetime strftime() methods require year >= 1900

这有什么问题?

4

1 回答 1

2

是的,这是您概念中的一个错误。你错误地增加a和减少weekstarta。所以它不是一天一天过去,而是 1、2、3、4、……天。

  • 7/10/2012是星期二。减去 1 天……</li>
  • 7/9/2012是星期一。减去 2 天……</li>
  • 7/7/2012是星期六。减去 3 天……</li>
  • 7/4/2012是星期三。减去 4 天……</li>
  • 6/30/2012是星期六。减去 5 天……</li>
  • 6/25/2012是星期一。减去 6 天……</li>
  • 6/19/2012是星期二。减去 7 天,即一周,循环越来越快,直到 1899 年中断。

这意味着如果你的第一天是星期二,那么它永远不会以这种方式到达星期日。

它适用于 2012 年 7 月 11 日(和任何星期三),它会在 2012 年 7 月 12 日(和任何星期四)休息,它会在 2012 年 7 月 13 日(和任何星期五)休息,它适用于 2012 年 7 月 14 日(和任何星期六)它适用于 2012 年 7 月 16 日(和任何星期一),当然它会在任何星期日立即停止。

但这不是你想要的。

如果您想在没有循环的任何一天获得上一个(或今天的)星期天,只需使用以下命令:

weekstart = weekstart - datetime.timedelta((weekstart.weekday() - 6) % 7)

或者,如果您想避免使用数学并使用库(dateutil):

from dateutil import relativedelta

weekstart = weekstart + relativedelta.relativedelta(weekday=relativedelta.SU(-1))
于 2012-07-12T07:10:25.597 回答