время с учетом часового пояса python

«Eppur si muove!»* или Работаем с таймзонами в Python

На нашей планете Земля, в одно и то же время, в разных географических точках планеты может быть разное время суток. Это следствие того, что наш мир — вращающийся геоид, а не плоский диск, а что наша Солнечная система имеет только одну звезду — Солнце. Ещё со школы всем известно о часовых поясах, и все мы встречались с их проявлениями в реальной жизни («Московское время – 15 часов, в Петропавловске-Камчатском – полночь», джетлаг при дальних перелётах, и т.д.). К несчастью, часовые пояса всего лишь частично основаны на физических особенностях нашего мира, и при компьютерных вычислениях приходится учитывать другие, порой неожиданные, нюансы.

* «И всё-таки она вертится!» — крылатая фраза, которую якобы произнёс Галилео Галилей, покидая процесс инквизиции после отречения от своего убеждения в том, что Земля вращается вокруг Солнца. В нашем случае, увы, это вращение приводит ко всем этим «замечательным» проблемам с часовыми поясами.

Что общего у этой статьи и Галилео? Да, в общем-то, ничего. Боюсь, что если бы наш мир был центром вселенной, нам всё равно пришлось бы иметь дело с таймзонами. Будем считать заголовок моей оплошностью, которую я уже не могу исправить (хотя я могу).

Что такое «Часовой пояс»?

Какой у вас часовой пояс? Если вы ответите «UTC+3» — это будет правильным ответом только на текущий момент времени, но в целом это заявление некорректно. Если вы посмотрите на базу данных часовых поясов, то увидите, к примеру, что Берлин и Вена, несмотря на смещение «UTC+1», имеют разные часовые пояса («Europe/Berlin» и «Europe/Vienna»). Почему так? Причина в том, что они имели разное летнее время (DST) в разные периоды истории. Даже если сегодня эти две страны и эти два города имеют одинаковые правила DST, сто лет назад это было не так. Например, и в Австрии и в Германии в разные периоды времени не было перехода на летнее время: в Австрии с 1920 года, а в Германии с 1918. Во время Второй мировой войны обе страны имели одинаковые правила DST (что не удивительно), однако после её окончания снова рассинхронизировались. Германия отменила переход на летнее время в 1949 и ввела его снова в 1979, Австрия же отменила DST в 1948 и ввела его снова в 1980. Самое же худшее состоит в том, что они даже не согласовали одинаковую дату перехода на летнее время.

И так происходит по всему миру. Для компьютерных вычислений, переход на летнее время — огромная проблема, ведь мы предполагаем, что время имеет непрерывный мотононный ход. С переходом на летнее время у нас каждый год есть час, который повторяется дважды, и есть час, который мы просто пропускаем. Если при записи в лог вы указываете локальное время, у вас можем нарушится порядок строк лога при сортировке.

Цитата из документации pytz:

Так, например, в таймзоне US/Eastern в 2002 году во время окончания действия DST, 27 октября время 01:30 наступило дважды, а во время начала действия DST, 7 апреля время 02:30 не наступило, т.к. в 02:00 часы перевели на час вперёд.

Но в таймзонах хранятся не только правила перехода на летнее время. Некоторые страны меняют часовые пояса, иногда даже без изменения DST. Так, например, в 1915 году Варшава перешла на Центральноевропейское время. В результате в полночь 5 августа 1915 года часы были переведены на 24 минуты назад (при этом в Варшаве действовало летнее время).
Вообще, с часовыми поясами творится ещё больший ад. Есть как минимум одна страна, таймзона которой была различна в течение дня из-за синхронизации времени 0:00 с временем восхода Солнца.

Где же здравый смысл?

Здравый смысл есть и он называется Всемирное координированное время (UTC). UTC — это таймзона без перехода на летнее время и без каких бы то ни было изменений в прошлом. Однако по причине того, что наша Земля — вращающийся геоид и в мире есть вещи, которые мы не можем контролировать, существует проблема корректировочных секунд (leap seconds). Будет ли UTC учитывать корректировочные секунды (которые нерегулярны и поэтому их достаточно проблематично учитывать при вычислениях), или не будет (тогда каждая таймзона будет иметь разницу в несколько секунд с UTC), — насколько мне известно, ещё не решено.

Несмотря на это, прямо сейчас UTC — самый безопасный вариант. Из UTC вы можете сконвертировать время в локальное для любого часового пояса. Обратное преобразование, учитывая вышесказанное, невозможно.

Итак, вот главное практическое правило, которое никогда вас не подведёт:

Всегда храните и работайте со временем в UTC. Если вам нужно сохранить оригинальные данные — пишите их отдельно. Никогда не храните локальное время и таймзону!

В чём проблема?

Вообще, на этом статья должна была бы закончиться. Но к несчастью, есть пара вещей, которые необходимо держать в памяти, когда вы программируете на Python. Это наследие архитектурных решений тех давних времён, когда никто не думал о практическом применении языка. Мотивация имела значение, здравый смысл — нет.

Если закрыть глаза на тот ужасный API, с помощью которого вам приходится добавлять информация о таймзоне к объекту datetime, всё равно остаются проблемы. Когда вы работаете с объектами datetime в Питоне, вам рано или поздно придётся добавлять или удалять tzinfo во всех местах вашей программы.

Другая проблема состоит в том, что у вас есть два способа создать объект datetime с текущим временем в Python:

Один возвращает время в UTC, другой — локальное время. Однако объект datetime не скажет вам, что такое «локальное время» (потому что он не имеет информации о таймзоне, по крайней мере до версии Python 3.3), и нет никакого способа узнать, который из этих объектов хранит время в UTC.

Если вы конвертируете UNIX timestamp в объект datetime, вам так же следует быть осторожным при использовании метода datetime.datetime.utcfromtimestamp, потому что он принимает timestamp в локальном времени.

Библиотека datetime так же предоставляет объекты date и time, в которые абсолютно бесполезно добавлять tzinfo. Объект time не может быть переведён в другую таймзону, поскольку для этого нужно знать дату. Объект date вообще имеет смысл только для локальной таймзоны, потому что «сегодня» для меня может быть «вчера» или «завтра» для вас — скажем спасибо чудесному миру часовых поясов.

Так каковы рекомендации специалистов?

Теперь мы знаем, кто виноват. Но что делать? Если мы проигнорируем теоретические проблемы, проявляющиеся только в случае работы с историческими датами в прошлом, то вот вам ряд рекомендаций. На тот случай, если вам приходится работать с историческими датами, есть альтернативный модуль mxDateTime, достаточно качественно спроектированный и даже поддерживающий различные календари (Григорианский и Юлианский).

Используйте UTC внутри программы

Если вам нужно получить текущее время, всегда используйте datetime.datetime.utcnow(). Если вы получаете локальное время от пользователя, всегда тут же преобразовывайте его в UTC. Если однозначного преобразования сделать не получается — сообщайте об этом пользователю, не пытайтесь угадать его время вслепую. Во время перехода на летнее время и обратно, мой iPhone несколько раз не смог правильно перевести время. Я же знаю, когда это нужно сделать, поскольку мне приходится переводить стрелочные часы.

Никогда не используете время с часовым поясом

Другая причина не использовать время с таймзоной заключается в том, что объект tzinfo очень специфичен и сильно зависит от своей реализации. Не существует стандартного способа передавать информацию о таймзоне (за исключением, пожалуй, таймзоны UTC) в другие языки, по HTTP и т.д. К тому же объекты datetime с информацией о таймзоне, зачастую, становятся слишком огромными при сериализации с помощью модуля pickle, или их даже невозможно бывает сериализовать (это зависит от реализации объекта tzinfo).

Преобразования для форматирования

Если вам нужно показать время в таймзоне пользователя, возьмите объект datetime с временем по UTC, добавьте в него таймзону UTC, преобразуйте время в локальное время пользователя и отформатируйте его. Не используйте преобразование таймзоны методами tzinfo, ибо они работают некорректно, используйте pytz. Потом переведите время в «наивное» путём отбрасывания смещения таймзоны из получившегося объекта datetime, который вы создали для форматирования и продолжайте жить счастливо.

Бонус от переводчика для тех, кто дочитал до конца:

А в следующей своей статье я напишу, где автор неправ, почему он ошибается и как же всё-таки нужно делать правильно.

Источник

Текущая дата и время в Python

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Время и дата играют важнейшую роль при решении определенных задач в программировании. Разработчику на Python приходится нередко использовать точные значения текущей (current) даты, к примеру, при сохранении информации в базе данных, вычислениях, регистрации, обеспечении доступа и т. д. В этой статье пойдет разговор о том, как узнать текущие временные значения с помощью модуля datetime. Вдобавок к этому, читатель узнает о временных настройках для разных часовых поясов и преобразовании объектов datetime в метки времени Unix.

Получаем текущую дату и время

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

Для примера можно вывести в терминал текущую (current) дату и время. Можно воспользоваться объектом datetime.datetime — из него довольно просто извлекаются объекты date и time. Сначала следует импортировать требуемый модуль:

from datetime import datetime

Да, это выглядит странновато, т. к. речь идет о получении класса datetime из модуля datetime, однако это 2 разные вещи. Далее следует воспользоваться функцией now() — она позволит получить объект с текущим временем и датой.

from datetime import datetime

Набрав код выше, вы увидите на экране следующее (в вашем случае вывод изменится, ведь минуты не стоят на месте):

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Что произошло? Функция now() отобразила объект, причем с датой и временем создания этого самого объекта. В результате была выведена соответствующая строка. Однако никто не мешает получить временные атрибуты отдельно:

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Таким образом, метод now() вполне годится для получения текущей даты и времени. Но что делать, если надо получить лишь дату?

Работа с датой current

Существуют 2 способа получения текущей даты. Первый выводит нужные данные из объекта datetime посредством метода date() :

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Во втором применяется метод today() класса date:

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Класс datetime.date позволяет получать календарную дату. Также следует добавить, что его атрибуты (year, month, day) бывают доступны и отдельно, как в примере с datetime.

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

А как поступить, если надо отобразить текущее время отдельно от даты?

Работаем с текущим временем

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

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

Важно отметить, что есть возможность получить временные данные и с учетом нужного часового пояса (timezone). Как и что используется, поговорим ниже.

Другой часовой пояс: временные зоны (timezones)

Метод now() принимает в Python временную зону в качестве аргумента, так что объект datetime генерируется соответствующим образом.

Для получения информации с учетом часового пояса необходимо задействовать библиотеку pytz (если ее нет, потребуется инсталляция, для чего подойдет команда pip3 install pytz ).

Так как я нахожусь в Минске, давайте получим текущие временные значения (times) именно для Минска:

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Строка в коде minsk_current_datetime является объектом datetime, то есть все то же самое, что и ранее, но уже в полном соответствии с часовым поясом Республики Беларусь.

Когда надо узнать время в UTC, тоже пригодится модуль pytz:

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Получить время UTC можно и без модуля pytz, т. к. datetime имеет полезное свойство timezone. Что же, давайте задействуем свойство timezone:

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

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

Преобразование временных меток

Также может быть очень полезным преобразовывать время в один из самых широко применяемых форматов в вычислениях. Речь идет о временных метках Unix.

Доподлинно известно, что компьютерные системы измеряют время не так, как люди. Здесь за основу берется число секунд, которые прошли с начала Unix-эпохи, то есть с 00:00:00 UTC 1.01.1979. Базы данных, протоколы и приложения обычно задействуют временную метку.

Для ее получения в «Питоне» пригодится модуль time, следовательно, первая строка будет import time :

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Функция time.time() возвращает пользователю число с плавающей запятой и с временной меткой Unix.

На этом все. Очень надеемся, что вы получили некоторое представление об использовании встроенных Python-библиотек и модулей, необходимых для отображения временных значений.

Источник

Как использовать модуль datetime в Python

Datetime — важный элемент любой программы, написанной на Python. Этот модуль позволяет управлять датами и временем, представляя их в таком виде, в котором пользователи смогут их понимать.

datetime включает различные компоненты. Так, он состоит из объектов следующих типов:

Как получить текущие дату и время?

Получить текущую дату в Python

Класс date можно использовать для получения или изменения объектов даты. Например, для получения текущей с учетом настроек подойдет следующее:

Текущая дата — 2020-11-14 в формате год-месяц-день соответственно.

Получить текущее время

Для получения текущего локального времени сперва нужно получить текущие дату и время, а затем достать из этого объекта только время с помощью метода time() :

Компоненты datetime в Python

В этом руководстве речь пойдет о следующих элементах:

Как создавать объекты даты и времени

В этом примере создается объект времени представленный следующим образом (8, 48, 45).

Для создания объекта даты нужно передать дату с использованием следующего синтаксиса:

Вернет вот такой результат:

Timedelta

Все аргументы опциональные и их значения по умолчанию равно 0. Они могут быть целыми или числами с плавающей точкой, как положительными, так и отрицательными. Благодаря этому можно выполнять математические операции, такие как сложение, вычитание и умножение.

Как вычислить разницу для двух дат

Посмотрим на несколько примеров вычисления разницы во времени. Предположим, есть два объекта datetime :

Для получения разницы нужно лишь вычесть значение одного объекта из второго:

Таким образом между 2 и 30 октября 2020 года 28 дней.

Как вычислить разницу двух объектов datetime.time

Такой код вернет следующую ошибку:

Как получать прошлые и будущие даты с помощью timedelta

Поскольку timedelta — это длительность, то для получения прошлой или будущей даты нужно добавить объект timedelta к существующему или вычесть из него же. Вот пример нескольких уравнений, где n — это целое число, представляющее количество дней:

Если нужно, например, получить дату за прошлые две недели, то достаточно вычесть 14 дней из текущей даты:

Предположим, вы задумали практиковать определенный навык в течение 21 дня. Для получения будущей даты нужно добавить 21 день к текущей дате:

Другие арифметические операции с timedelta

Значения даты и времени могут сравниваться для определения того, какая из них была раньше или позже. Например:

Часовые пояса

Пока что мы работали с datetime без учета часовых поясов и летнего времени. Но прежде чем переходить к следующим пунктам, нужно разобраться с разницей в абсолютных (naive) и относительных (aware) датах.

Абсолютные даты не содержат информацию, которая бы могла определить часовой пояс или летнее время. Однако с такими намного проще работать.

Относительные же содержат достаточно информации для определения часового пояса или отслеживания изменений из-за летнего времени.

Разница между DST, GMT и UTC

Как работать с часовыми поясами

Рассмотрим, как создать простой относительный объект datetime :

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

Вот некоторые из них:

Для получения времени в Найроби:

А вот так можно получить время Берлина:

Здесь можно увидеть разницу в часовых поясах разных городов, хотя сама дата одна и та же.

Конвертация часовых поясов

При конвертации часовых поясов в первую очередь нужно помнить о том, что все атрибуты представлены в UTC. Допустим, нужно конвертировать это значение в America/New_York :

Другие практические примеры

Всегда храните даты в UTC. Вот примеры:

Как конвертировать строки в datetime

strptime() в Python — это метод из модуля datetime. Вот его синтаксис:

Аргументы формата необязательные и являются строками. Предположим, нужно извлечь текущие дату и время:

Источник

Сравнение дат в Python – С часовыми поясами и без них

В этом уроке мы рассмотрим, как сравнивать даты в Python с часовыми поясами и без них, используя pytz, с примерами.

Вступление

При работе с датами, часто, вы хотели бы знать, если данная дата приходит до или после другой даты. Мы можем получить эти ответы, сравнивая даты.

В этой статье мы узнаем, как использовать модуль Python datetime для создания и сравнения как наивных (без информации о часовом поясе), так и осведомленных (с информацией о часовом поясе) дат.

Это приведет к TypeError :

Сравнение Часового пояса-Наивная дата-время

Затем давайте сделаем несколько дат, которые мы можем сравнить:

Сравнивать эти объекты так же легко, как сравнивать, скажем, целые числа. А дата меньше другой, если ее время предшествует другому.

Теперь вы обычно включаете эту логику в некоторые операторы управления потоком:

Сравнение времени с учетом Часовых Поясов

Часовые пояса могут немного усложнить ситуацию, хотя, к счастью, мы можем применить ту же самую логику к сравнению. Единственное отличие заключается в том, что мы работаем с aware dates – датами с дополнительной информацией о часовом поясе, в котором они находятся:

Запуск этого кода приводит к:

В то время как это утверждение:

Here, we’ve used the pytz library to make our наивные свидания aware. We’ve constructed a timezone object for New York ( tz_ny ), and a timezone object for London ( tz_lon ).

Пожалуйста, имейте это в виду при работе с часовыми поясами таким образом.

Однако стоит отметить, что сравнение осведомленных дат с наивными датами приведет к ошибке:

Это приведет к следующей ошибке:

Таким образом, чтобы сравнивать объекты datetime, оба объекта должны быть либо наивными, либо осознанными.

Вывод

В этой статье мы обсудили способы сравнения как часовых поясов, так и часовых поясов в Python, а также рассмотрели возможные подводные камни, с которыми мы можем столкнуться при сравнении дат и возможных обходных путей.

Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте их в разделе комментариев ниже.

Источник

Работа с датой и временем в Python

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Введение

Примеры

Как спарсить строку в datetime с часовым поясом

Теперь переменная dt представляет собой объект datetime со следующим значением:

Простые арифметические операции с датами

Даты не существуют изолированно. Обычно нужно найти количество времени между датами или определить, какая дата будет завтра. Это можно сделать с помощью объектов timedelta :

Использование базовых объектов

Модуль datetime содержит три основных типа объектов: отдельно дату, отдельно время и дату вместе со временем.

Итерация по датам

Если нужно перебрать диапазон дат от даты начала до некоторой даты окончания, то можно использовать библиотеку datetime и объект timedelta :

Спарсить строку с двухбуквенным часовым поясом и перевести в UTC

Используя библиотеку dateutil можно парсить временные метки с коротким буквенным именем часового пояса.

Например, CST. Это может быть Центральным стандартным временем, Стандартным временем в Китае, Стандартным временем Кубы и т.д. Полный список можно посмотреть здесь.

При использовании с этим методом часового пояса pytz — часовой пояс правильно не локализуется:

Привязка часового пояса pytz к дате и времени:

Если вы используете этот метод, вы должны повторно использовать localize для простых значений даты и времени:

Создание даты и времени в разных часовых поясах

Пересчёт часовых поясов

Часовые пояса с переходом на летнее время

Для часовых зон с летним временем в стандартных библиотеках python нет стандартных классов. Поэтому нужно использовать стороннюю библиотеку. Есть pytz и dateutil — популярные библиотеки, в которых представлены классы часовых поясов.

Помимо стандартных часовых поясов, в dateutil есть классы часовых поясов, в которых используется летнее время (см. Документацию для модуля tz ). Можете использовать метод tz.gettz() для получения объекта часового пояса, который затем можно передать непосредственно в datetime :

В крайних случаях при использовании pytz это можно сделать вручную, но в pytz часовые пояса не должны быть непосредственно привязаны через конструктор. Вместо этого временная зона pytz должна быть присоединена к часовому поясу с использованием метода localize:

Если вы рассчитываете дату и время в часовом поясе pytz — вы должны либо выполнить вычисления для UTC (чтобы получить абсолютное истекшее время), либо используйте normalize() :

Извлечение даты и времени из текста (неопределенный анализ даты и времени)

Можно извлечь дату из текста, используя синтаксический анализатор dateutil в режиме «fuzzy», в котором компоненты строки, не идентифицирующиеся как часть даты, игнорируются.

Переключение между часовыми поясами

Спарсить произвольный timestamp в ISO 8601 с минимумом подключаемых библиотек

У Python ограниченная поддержка анализа временных меток ISO 8601. Для того, чтобы использовать strptime — вам нужно точно знать его формат. Сложность в том, что в datetime с временной меткой ISO 8601 есть 6-разрядная дробь:

Если дробная часть равна 0, то она не выводится:

Он поддерживает дроби, часовые пояса и T разделитель внутри единственной функции:

Преобразование timestamp в datetime

Эпоха: 1 января 1970 года, полночь.

Вычисление количества месяцев с даты

Использование модуля calendar

Использование модуля dateutils

Вычисление разницы во времени

Модуль timedelta пригодится для вычисления разницы во времени:

При создании нового объекта datetime указывать время необязательно.

delta — это тип timedelta

Чтобы получить n дней после даты:

Чтобы получить n дней до даты:

Получение временной метки ISO 8601

Без часового пояса с микросекундами

С часовым поясом и с микросекундами

С часовым поясом без микросекунд

Синтаксис

Параметры

Примечания

Python предусматривает наличие встроенных методов и внешних библиотек для создания, модификации, разбора и управления датой и временем.

время с учетом часового пояса python. время с учетом часового пояса python фото. картинка время с учетом часового пояса python. смотреть фото время с учетом часового пояса python. смотреть картинку время с учетом часового пояса python.

Научим основам Python и Data Science на практике

Это не обычный теоритический курс, а онлайн-тренажер, с практикой на примерах рабочих задач, в котором вы можете учиться в любое удобное время 24/7. Вы получите реальный опыт, разрабатывая качественный код и анализируя реальные данные.

Работа с XML из Python

Введение Не все элементы входных данных XML будут в конечном итоге являться элементами анализируемого дерева. В настоящий момент этот модуль пропускает все комментарии XML, инструкции по обработке и объявления типа документа во входных

Множества (sets) в Python

Синтаксис empty_set = set() # инициализирует пустое множество literal_set = <'foo', 'bar', 'baz'># строит множество с 3мя строками внутри set_from_list = set([‘foo’, ‘bar’, ‘baz’]) # вызов функции set() для создания нового множества set_from_iter

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *