Python datetime вычитание даты странности - PullRequest
1 голос
/ 29 февраля 2012

У меня есть объект datetime, из которого я вычитаю 13 дней следующим образом:

(date.today()-timedelta(days=13)).strftime('%Y-%m-%d')

Странность возникает, когда я выполняю код в 6 утра и 8:30 утра.В 6 утра результирующая строка возвращается как (если сегодня 2012-02-29):

2012-02-15

, что за 14 дней до текущего!Однако при выполнении той же строки в 8:30 утра результирующая строка возвращается в виде:

2012-02-16

Что затем исправить.До сих пор я не смог выяснить, в чем разница между небольшим периодом времени.Я использую наивные объекты даты и времени, если это важно.Я хотел бы знать, что может вызвать это изменение в итоговой строковой дате.

Большое спасибо.

РЕДАКТИРОВАТЬ: (основываясь на предложении eumiro ниже)

datetime.datetime.now () возвращает:

>>> datetime.datetime(2012, 2, 29, 10, 46, 20, 659862) 

И часовой пояс - Европа / Вена на сервере и в приложении django, которое выполняет строку кода.

Я также попытался запустить строку, аналогичную предложенной вами:

(pytz.timezone(settings.TIME_ZONE).localize(datetime.now(), is_dst=True) - \
    timedelta(days=13)).strftime('%Y-%m-%d') 

Но с теми же результатами ... поэтому я думаю, что не думаю, что это имеет многоделать с часовыми поясами тоже.Но в то же время не уверен, где еще искать.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

К сожалению, DST плохо поддерживается в Python.

Даже pytz не идеален, но его можно настроить для работы с хакерами.

Вы должны решить, что значит вычесть 2 дня из10-го, 13:00, либо 2 календарных дня, либо 48 часов, либо 172800 секунд.

0 голосов
/ 29 февраля 2012

Вы живете где-то в Америке?Это место, где часовые пояса находятся примерно на 6-8 часов позади UTC, и это время полуночи UTC.

Что возвращает datetime.datetime.now()?

Если вы хотите получить реальноепо местному времени используйте это (замените "America/New_York" на ваш часовой пояс):

from datetime import datetime, timedelta
import pytz

now = datetime.datetime.now(pytz.timezone("America/New_York"))
dt = (now - timedelta(days=13)).strftime('%Y-%m-%d')

, и оно должно возвращать те же правильные значения с полуночи до полуночи.

...