25

この呼び出しを使用して昨日の日付を YYYY-MM-DD 形式で取得する Python スクリプトがあります。

str(date.today() - timedelta(days=1)))

2013-03-11 0:35 CDTほとんどの場合は機能しますが、今朝スクリプトを実行する"2013-03-09"と、"2013-03-10".

おそらく夏時間 (昨日から始まった) が原因です。24時間引いた実装方法だと思いますtimedelta(days=1)が、24時間前2013-03-11 0:35 CDT2013-03-09 23:35 CSTで、結果は でし"2013-03-09"た。

Pythonで昨日の日付を取得するためのDSTセーフな方法は何ですか?

更新: bukzor が私のコードが正しく動作するはずだと指摘した後、スクリプトに戻って、それが使用されていないと判断しました。デフォルト値を設定しますが、ラッパー シェル スクリプトが日付を明示的に設定していました。したがって、バグは python スクリプトではなく、シェル スクリプトにあります。

4

3 に答える 3

39
datetime.date.fromordinal(datetime.date.today().toordinal()-1)
于 2013-03-11T17:29:28.937 に答える
10

問題を python2.7 または python3.2 で再現できません:

>>> import datetime
>>> today = datetime.date(2013, 3, 11)
>>> print today
2013-03-11
>>> day = datetime.timedelta(days=1)
>>> print today - day
2013-03-10

これはすでに「夏時間セーフ」yesterday()機能の最も単純な実装のように思えます。

于 2013-03-11T17:42:30.460 に答える
7

タイムゾーン (および特に DST) について何も知らない単純なオブジェクト2013-03-10を使用すると、次のようになります。datetime

from datetime import datetime, timedelta

dt_naive = datetime(2013, 3, 11, 0, 35)
print((dt_naive - timedelta(days=1)).date()) # ignores DST
# -> 2013-03-10

2013-03-0924 時間前の日付に関心がある場合は、正しいです。

import pytz # $ pip install pytz

local_tz = pytz.timezone("America/Chicago") # specify your local timezone
dt = local_tz.localize(dt_naive, is_dst=None) # raise if dt_naive is ambiguous
yesterday = local_tz.normalize(dt - timedelta(days=1)).date()
print(yesterday)
# -> 2013-03-09

注:.date()タイムゾーン情報を削除すると、次のように2013-03-10なります。

print(dt.date() - timedelta(days=1))
# -> 2013-03-10

特定のタイムゾーンで昨日を取得するには:

from datetime import datetime, time, timedelta
import pytz # $ pip install pytz

tz = pytz.timezone("America/Chicago")
yesterday = datetime.now(tz).date() - timedelta(days=1)

# to add timezone info back (to get yesterday's midnight)
midnight = tz.localize(datetime.combine(yesterday, time(0, 0)), is_dst=None)

タイムゾーンにその時間帯の日数が含まれていない場合、タイムゾーン情報を削除して昨日を取得すると失敗する可能性があります。次に、このメソッドは、指定されたタイムゾーンに存在しない日付を生成します (tz.localize()エラーが発生します)。

于 2013-03-11T17:54:05.940 に答える