Сравнение часовых поясов, Разница времени Москва (Россия) - Хабаровск (Россия)
Воспроизведем эту ошибку, сравнив datetime наивные и сознательные объекты :. Но страна вовсе не означает время. Жителей 60 аварийных домов Астаны переселят в квартир 29 марта Переход на летнее время отменён в году. Категории : География Украины Время по странам.
Чем заняться. Запланируйте поездку. Для бизнеса. Для туриста. Разместите свой бизнес на Национальном туристском портале Модуль «Коммерческая платформа» Туристическая экосистема Модуль «Туризм онлайн» Просмотреть статистику в сфере туризма Модуль «Tourstat» Стать инвестором туристических проектов Модуль «Инвестиции» Уведомление о прибытии иностранного гостя Информационная система «eQonaq» Подать заявку на субсидирование Модуль «Субсидирование».
Астана Алматы Шымкент Акмолинская область Актюбинская область Жетысуская область Алматинская область Атырауская область Восточно-Казахстанская область Абайская область Жамбылская область Карагандинская область Улытауская область Костанайская область Кызылординская область Мангистауская область Павлодарская область Туркестанская область Западно-Казахстанская область Северо-Казахстанская область.
Виды туризма. Туристические объекты. Магазины сувениров. Разместите свой бизнес на Национальном туристском портале Модуль «Коммерческая платформа». По умолчанию поддержка часовых поясов отключена. Чтобы активировать его, укажите в вашем файле настроек. Для поддержки часовых поясов используется pytz, который устанавливается при установке Django.
Файл, settings. Дополнительные сведения в разделе « Регионализация форматов». Если у вас возникла какая-то конкретная проблема, сначала прочтите часто задаваемые вопросы о часовых поясах. Если этот атрибут установлен и описывает разницу во времени, объект datetime находится в курсе. В противном случае это наивно. Когда поддержка часовых поясов отключена, Django использует datetime наивные объекты в местном времени.
Во многих случаях этого достаточно. В этом режиме, чтобы получить текущее время, вы должны написать:. Если ваш код создает объекты datetime , они также должны знать. В этом режиме приведенный выше пример выглядит следующим образом:. Манипулирование datetime сознательными объектами не всегда интуитивно понятно.
Например, tzinfo стандартная настройка конструктора datetime не работает надежно для часовых поясов с летним временем. Использование времени UTC в целом безопасно; если вы используете другие часовые пояса, вам следует внимательно прочитать документацию pytz. Объекты datetime. Однако, как поясняется в документации PostgreSQL, этот тип «предоставляет свойства, которые делают его полезность сомнительной».
Django поддерживает только time наивные объекты и выдает исключение, если вы пытаетесь зарегистрировать time сознательный объект , поскольку часовой пояс не имеет смысла для объекта time без связанной даты. Когда уровень базы данных получает один, он пытается уведомить его, интерпретируя его в часовом поясе по умолчанию, и генерирует предупреждение. К сожалению, при переходе на летнее время некоторые объекты datetime не существуют или выглядят неоднозначно.
В таких ситуациях pytz генерирует исключение.
Вот почему вы всегда должны создавать datetime осведомленные объекты, когда включена поддержка часового пояса. На практике это редко бывает проблемой. Django создает datetime сознательные объекты в моделях и формах, и большую часть времени новые объекты datetime создаются из существующих объектов с помощью операций timedelta. Единственный объект, datetime который часто создается в коде приложения, - это текущее время и timezone. Вы должны установить текущий часовой пояс на фактический часовой пояс пользователя с помощью activate.
В противном случае используется часовой пояс по умолчанию. Однако, как объяснялось выше , это не совсем надежно, и вы все равно должны работать с объектами, datetime поддерживающими UTC, в своем собственном коде. Например, используйте fromtimestamp и установите для параметра tz значение utc. Текущий часовой пояс эквивалентен текущему языку переводов. Однако нет эквивалента HTTP-заголовку, Accept-Language который Django мог бы использовать для автоматического определения часового пояса пользователя.
Вместо этого Django предоставляет функции выбора часового пояса.
Используйте их для построения логики выбора часового пояса, которая имеет смысл в вашей ситуации. Большинство веб-сайтов, связанных с часовыми поясами, запрашивают у пользователей их домашний часовой пояс и сохраняют эту информацию в профиле пользователя.
Для анонимных пользователей они используют часовой пояс большей части своей аудитории или UTC. Вот пример, который хранит текущий часовой пояс в сеансе для простоты обработка ошибок полностью отсутствует. Добавьте форму, в template. Когда вы включаете поддержку часового пояса, Django преобразует объекты datetime в текущий часовой пояс, когда они отображаются в шаблоне. Это поведение очень похоже на регионализацию форматов. Django не конвертирует datetime наивные объекты, потому что они могут быть неоднозначными и потому что ваш код никогда не должен создавать такие наивные объекты, когда включена поддержка часовых поясов.
Однако вы можете принудительно выполнить преобразование с помощью шаблонных фильтров, описанных ниже. Преобразование в местное время не всегда подходит, например, если вы создаете контент для других компьютеров. Следующие фильтры и теги, доступные в библиотеке тегов шаблонов tz , используются для управления преобразованием часовых поясов.
Включает или отключает преобразование datetime сознательных объектов в текущем часовом поясе внутри содержащегося блока. Если пользователь расположен далеко, например, на другом континенте, это может вызвать значительные неудобства. По какой-то причине зона была отброшена, и в базу вместо "T UTC" исходное плюс 5 часов записалось "T UTC" исходное минус 1 час.
Ошибка в 10 часов! Представьте, что это напоминания о поездке или рассылка смс. Убедитесь, что для получения текущего времени вы используете функцию с utc в ее имени, например, datetime. Вариантов тут два: либо приклеить к строке со временем нужную зону, либо явно указать библиотеке, что это время в UTC:.
Теперь все правильно. Это беда, но лечится явным указанием зоны. Например, вы в Москве, а сервер в Нью-Йорке. Он отдает локальное время "T". Нью-Йорк в минус пятом часовом поясе.
Приклеим зону к строке и распарсим:. Значит, это вечера по Москве. Проверим устно: если от НЙ до нулевого меридиана 5 часов, а потом еще 3 часа до Москвы, то в сумме 8 часов. Это значит в количестве секунд со дня рождения ОС Юникс — 1 января года.
Такое время всегда представлено в UTC. Отобразить его пользователю можно так:. На мой взгляд, хранение времени в виде числа секунд имеет ряд недостатков. Во-первых, оно совершенно нечитаемо. По набору цифр невозможно определить даже год с точностью до десятка.
Во-вторых, это не оптимально. Современные БД хранят даты в таком виде, чтобы было удобно обращаться к их составным частям. Напротив, хранение в дат в секундах требует постоянной конвертации. Научиться работать со временем не сложно. Главное — не оправдывать лень и не дожидаться момента, когда съедут все даты вечером в пятницу. Воздержитесь от собственных поделок для работы с часовыми поясами. Оставляйте операции со временем на откуп проверенным библиотекам. Выносите вспомогательные функции в особый модуль.
При кодировании дат в JSON последний сам позаботится часовом поясе. Вы не должны что-то прибавлять или вычитать.
Маленький бонус: рассмотрим как быть, если формировать локальное время нужно не на клиенте, а на сервере. До сих пор я вел разговор в том ключе, что у нас Single page application и все рендериться на клиенте. Однако, чисто серверные приложения никуда не делись, и такая задача тоже может возникнуть. Представим, что даты хранятся в UTC, но вот пришел HTTP-запрос от какого-то пользователя, и нужно показать даты в его локальном формате.
Как быть? Пока у нас нет никаких данных о пользователе, можно, используя его IP, через сторонний сервис или библиотеку с локальной базой адресов на борту хотя бы примерно определить его страну или даже город.
По этом данным станет легко вывести временной пояс. Но страна вовсе не означает время.
Так, пользователь Воронежа может сидеть через прокси или Тор с выходной нодой где-то в Индии, но при это его локальное время не имеет отношения к этой стране. Узнать локальное смещение можно через специальный метод объекта Date :. Оно выражено в минутах и имеет знак противоположный часовому поясу. С помощью скрипта это значение можно положить в куки на стороне клиента, и тогда все последующие запросы к серверу будут сообщать о настоящем часовом поясе пользователя.
Чтобы привести время UTC в локальное на сервере, достаточно вычесть из первого смещение в минутах. При этом нужно держать в уме знак: вычитание отрицательных минут означает их прибавление, что нам и нужно.
Это был пример явной манипуляции с часовыми поясами. Выше я писал, что этого следует избегать. Однако, здесь явно присутствует понимание того, что мы делаем. Простой вычет будет эффективней и проще использования навороченной библиотеки с часовыми поясами. Ну вот и все, думаю, это было не сложно. Я не люблю просить о репостах и никогда не делал этого, но на этот раз сделаю исключение. Прошу показать эту статью тем, кто связан с веб-разработкой, особенно фронтендом. Возможно, хоть где-то удастся избежать ошибок вроде тех, что я описал в самом начале.
Может, хоть немного облегчатся чьи-то будни. Роман Ковалев, 24th Mar , link. Очень понравилось, спасибо! Нашел ответы на вопросы, которые ношу в голове последние лет пять.
Anatoliy, 6th Sep , link. Отличная статья. Хотя и не на все свои вопросы я нашел ответы. А что если у меня сервис бронирования времени с прикрученым напоминанием за сутки?