Мне никогда не приходилось переводить время в и из UTC. Недавно у меня был запрос, чтобы мое приложение знало часовой пояс, и я бегал сам по кругу. Много информации о преобразовании местного времени в UTC, которое я нашел довольно элементарным (возможно, я тоже делаю это неправильно), но я не могу найти никакой информации о том, как легко преобразовать время UTC в часовой пояс конечных пользователей.
В двух словах, android app отправляет мне (appengine app) данные, и в этих данных есть временная метка. Чтобы сохранить эту метку времени в UTC время, которое я использую:
datetime.utcfromtimestamp(timestamp)
Кажется, это работает. Когда мое приложение хранит данные, оно сохраняется как 5 часов вперед (я EST -5)
Данные хранятся в BigTable приложения, и при получении они выглядят как строка:
"2011-01-21 02:37:21"
Как мне преобразовать эту строку в DateTime в часовом поясе пользователя?
Кроме того, каково рекомендуемое хранилище для информации о часовом поясе пользователей? (Как вы обычно храните информацию tz, например: «-5: 00» или «EST» и т. Д.?) Я уверен, что ответ на мой первый вопрос может содержать параметр, а ответы - второй.
Ответы:
Если вы не хотите предоставлять свои собственные
tzinfo
объекты, проверьте библиотеку python-dateutil . Он предоставляетtzinfo
реализации поверх базы данных zoneinfo (Olson) , так что вы можете ссылаться на правила часовых поясов по несколько каноническому имени.Изменить расширенный пример, чтобы показать
strptime
использованиеРедактировать 2 Исправлено использование API, чтобы показать лучший метод точки входа
Редактировать 3 Включены методы автоопределения часовых поясов (Ярин)
источник
dateutil.tz
и использоватьtz.tzutc()
иtz.tzlocal()
как объекты часового пояса, которые я искал. Похоже, что база данных часовых поясов в моей системе хорошая (я зарегистрировался/usr/share/zoneinfo
). Не уверен, что случилось.tz
Модуль является правильной точкой входа использовать для этой библиотеки. Я обновил свой ответ, чтобы отразить это.dateutil.zoneinfo
Модуль я показывал ранее внутренне используется вtz
модуле , как падение назад , если он не может найти системы ZoneInfo БД. Если вы загляните внутрь библиотеки, то увидите, что в пакете используется архив базы данных zoneinfo DB, если он не может найти базу данных вашей системы. Мой старый пример пытался поразить эту БД напрямую, и я предполагаю, что у вас возникли проблемы с загрузкой этой частной БД (не так ли по пути python?)dateutil
, используйтеpytz
вместо этого .Вот гибкий метод, который не зависит от каких-либо внешних библиотек:
Это позволяет избежать проблем с синхронизацией в примере с DelboyJay. И меньшие временные проблемы в поправке Эрика ван Остена.
В качестве интересной сноски вычисленное выше смещение часового пояса может отличаться от следующего, казалось бы, эквивалентного выражения, возможно, из-за изменений правила перехода на летнее время:
Обновление: у этого фрагмента есть слабость использования смещения UTC текущего времени, которое может отличаться от смещения UTC входной даты и времени. Смотрите комментарии к этому ответу для другого решения.
Чтобы обойти разные времена, возьмите время эпохи с прошедшего времени. Вот что я делаю:
источник
pytz
d-like db невозможна, см. PEP-431. Хотя вы можете написать решение только для stdlib, которое работает в таких случаях на системах, в которых уже есть исторический часовой пояс, например, Linux, OS X, см. Мой ответ .utc_datetime
времени.Смотрите документацию datetime на tzinfo объектов . Вы должны внедрить часовые пояса, которые хотите поддерживать сами. Примеры внизу документации.
Вот простой пример:
Вывод
источник
replace
чтобы установить часовой пояс GMT и сделать его «осведомленным» о часовом поясе, а затем использоватьastimezone
для преобразования в другой часовой пояс.Если вы хотите получить правильный результат даже для времени, которое соответствует неоднозначному местному времени (например, во время перехода на летнее время) и / или местное смещение utc отличается в разное время в вашем местном часовом поясе, тогда используйте
pytz
часовые пояса:источник
Этот ответ может быть полезен, если вы не хотите использовать какие-либо другие модули, кроме
datetime
.datetime.utcfromtimestamp(timestamp)
возвращает наивныйdatetime
объект (не осведомленный). Осведомленные осведомлены о часовом поясе, а наивные - нет. Вы хотите знать, если вы хотите конвертировать между часовыми поясами (например, между UTC и местным временем).Если вы не один экземпляр даты, чтобы начать с, но вы все равно можете создать наивный
datetime
объект во время UTC, вы можете попробовать этот код Python 3.x для его преобразования:Будьте осторожны, чтобы не ошибочно предположить, что, если ваш часовой пояс в настоящее время является MDT, переход на летнее время не работает с вышеуказанным кодом, поскольку он печатает MST. Вы заметите, что если вы измените месяц на август, он напечатает MDT.
Другой простой способ получить осведомленный
datetime
объект (также в Python 3.x) - создать его с часовым поясом, указанным для начала. Вот пример использования UTC:Если вы используете Python 2.x, вам, вероятно, придется
datetime.tzinfo
создать подкласс и использовать его для создания осознанногоdatetime
объекта, поскольку в Python 2.xdatetime.timezone
его не существует.источник
Если вы используете Django, вы можете использовать
timezone.localtime
метод:источник
Вы можете использовать стрелку
Вы можете кормить
arrow.get()
чем угодно. отметка времени, строка iso и т. д.источник
Я традиционно откладываю это на внешний интерфейс - отправляю время из бэкэнда в виде временных меток или какого-либо другого формата даты-времени в UTC, затем позволяю клиенту вычислить смещение часового пояса и отобразить эти данные в правильном часовом поясе.
Для веб-приложения это довольно легко сделать в javascript - вы можете довольно легко вычислить смещение часового пояса браузера, используя встроенные методы, а затем правильно отобразить данные из серверной части.
источник
Вы можете использовать,
calendar.timegm
чтобы преобразовать ваше время в секунды с эпохи Unix иtime.localtime
преобразовать обратно:Дает
Fri Jan 21 05:37:21 2011
(потому что я в часовом поясе UTC + 03: 00).источник
например, мой часовой пояс ' +08: 00 '. input utc = 2018-10-17T00: 00: 00.111Z , тогда я получу вывод = 2018-10-17T08: 00: 00 + 08: 00
источник
Из приведенного здесь ответа вы можете использовать модуль времени для преобразования из utc в местное время, установленное на вашем компьютере:
источник
Вот быстрая и грязная версия, которая использует настройки локальных систем для определения разницы во времени. ПРИМЕЧАНИЕ. Это не будет работать, если вам нужно преобразовать в часовой пояс, в котором ваша текущая система не работает. Я проверил это с настройками в Великобритании в часовом поясе BST.
источник
datetime.fromtimestamp(ts)
: posix timestamp (с плавающей запятой) -> объект datetime по местному времени (он хорошо работает, если ОС запоминает прошлые смещения utc для местного часового пояса, т. е. в Unix, но не в Windows для дат в прошлом). В противном случае можно использовать pytz.offset = datetime.utcnow().replace(minute=0, second=0, microsecond=0) - datetime.now().replace(minute=0, second=0, microsecond=0)
я получил странные микросекундные различия без него.datetime.fromtimestamp(ts)
вместо ответа?Консолидация ответа от франков в удобный способ.
источник