Python. Сегодня == сейчас
В каждом языке есть участки, которые не особо удались создателям. Для большинства языков, созданных до двухтысячных годов, камнем преткновения стала работа со временем.
Питон — не исключение. Возьмём функцию, которая сравнивает дату-время с точностью до минуты:
from datetime import datetime, timezone
def equal(dt1, dt2):
return dt1.replace(second=0, microsecond=0) == \
dt2.replace(second=0, microsecond=0)
И сравним «сегодня» и «сейчас»:
>>> equal(datetime.today(), datetime.now())
True
Оказывается, это одно и то же ツ Метод today()
возвращает не начало дня, как можно было бы ожидать, а текущий момент времени.
А что насчёт времени по UTC?
>>> equal(datetime.now(timezone.utc), datetime.utcnow())
False
Неожиданно, now()
с часовым поясом UTC и utcnow()
возвращают разные значения. Это потому, что now()
возвращает объект с часовым поясом, а utcnow()
— без. Хотя дата-время у них и совпадают.
Если работать с датой-временем средствами стандартной библиотеки, лучше всегда использовать или только наивные объекты (без часового пояса), или только осведомлённые (с часовым поясом). Если их смешать — гарантированно будет беда.
★ Подписывайтесь на новые заметки.