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増減weekstartしていaます。ですから、それは毎日ではなく、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 日、つまり 1 週間を引くと、ループは 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 に答える