Подтвердить что ты не робот

Получить вчера дату в Python, DST-safe

У меня есть python script, который использует этот вызов для получения вчерашней даты в формате YYYY-MM-DD:

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

Он работает большую часть времени, но когда script выполнял это утро в 2013-03-11 0:35 CDT, он возвращал "2013-03-09" вместо "2013-03-10".

Предположительно, летнее время (которое началось вчера) виновато. Я предполагаю, что способ timedelta(days=1) реализован, он вычитал 24 часа, а за 24 часа до 2013-03-11 0:35 CDT был 2013-03-09 23:35 CST, что привело к результату "2013-03-09".

Итак, какой хороший DST-безопасный способ получить вчерашнюю дату на python?

UPDATE: После того, как bukzor указал, что мой код должен работать правильно, я вернулся к script и решил, что он не используется. Он устанавливает значение по умолчанию, но оболочка оболочки script задает дату явно. Таким образом, ошибка находится в оболочке script, а не в python script.

4b9b3361

Ответ 1

datetime.date.fromordinal(datetime.date.today().toordinal()-1)

Ответ 2

Я не могу воспроизвести вашу проблему в 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().

Ответ 3

Вы получите 2013-03-10, если используете объект naive datetime, который ничего не знает о часовых поясах (и в частности DST):

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-09 является правильным, если вас интересует, какая дата была 24 часа назад.

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 midnight)
midnight = tz.localize(datetime.combine(yesterday, time(0, 0)), is_dst=None)

Получение вчерашней информации о разрыве часового пояса может завершиться неудачно, если в это время в часовом поясе отсутствовали дни. Тогда этот метод приведет к созданию несуществующей даты в заданном часовом поясе (tz.localize() вызывает ошибку).