日期错误?仅在某些日期收到错误

时间:2012-07-12 06:45:53

标签: python datetime strftime

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

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月7日,2012年12月7日或2012年7月13日时才会收到以下错误:

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

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

这有什么问题?

1 个答案:

答案 0 :(得分:2)

是的,这是你的概念中的一个错误。您错误地将a递增并按weekstart递减a。所以它不是日复一日,而是一天,两天,三天,四天......天。

  • 7/10/2012是星期二。减去1天......
  • 7/9/2012是星期一。减去2天......
  • 7/7/2012是星期六。减去3天......
  • 7/4/2012是星期三。减去4天......
  • 6/30/2012是星期六。减去5天......
  • 6/25/2012是星期一。减去6天......
  • 6/19/2012是星期二。减去7天,即一周,循环越来越快,直到1899年它破裂。

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

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

但这不是你想要的。

如果你想在没有循环的任何一天获得前一天(或今天的)星期日,请使用:

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

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

from dateutil import relativedelta

weekstart = weekstart + relativedelta.relativedelta(weekday=relativedelta.SU(-1))