Форум сайта python.su
Привет,
В питоне datetime.now() возвращает текущее локальное время, например, 1:00.
Использую PostgreSQL. У него настроено локальное время, select now() возвращает 1:00 +03 - все Ок.
В django есть класс с полем
date = models.DateTimeField(default=datetime.now)
Сохраняю в базу класс.save().
Получаю в базе 8:00 +03 - на 7 часов больше!
Беру из базы через модель.objects.filter получаю на выходе локальное время 1:00 - т.е. в базе +7 часов, но питон отнял их и получил правильное время.
Теперь иду в базу pgadmin-ом пишу insert into таблица_класса values (now()) получаю 1:00 +03. Никаких +7 часов. PostgreSQL работает корректно.
Беру из базы эту запись из питона, через модель.objects.filter получаю на выходе время 18:00 предыдущего дня - т.е. питон отнимает 7 часов от того что в базе!
Откуда взялись эти 7 часов разницы?
Пока не требовались прямые sql запросы в базу все было ок - через объекты сохраняет с +7 часов, возвращает делает -7 часов. Но когда понадобилось сравнивать даты в SQL все поплыло - беру из базы время 1:00, хочу получить ту же запись в базе сравнивая в запросе (cursor.connection(…)) и естественно ничего не получаю - я же сравниваю 1:00 с 8:00.
Время с начала эпохи в миллисекундах тоже отличается на 7 часов, хотя оно UTC по-определению. Т.е. в базе реально +7 часов.
Аналог default=datetime.now - auto_now_add=True работает точно так же, +7 часов.
Крыша едет :) Помогите!
Офлайн
Нашел решение.
В джанго в сеттингз была прописана TIMEZONE “US/Eastern”. И при сохранении объектов в базу передается время относительно этой зоны, те самые +7 часов. А база думает что это время UTC без сдвига.
Если вписать мою таймзону в джанго, то в базу попадает правильное время.
А как оно будет работать у коллег в другой зоне кто его знает ..
Офлайн
На эту тему кстати была очень хорошая статейка: http://asvetlov.blogspot.com/2011/02/date-and-time.html
Офлайн