Как сделать московское время в datetime

Добавил пользователь Евгений Кузнецов
Обновлено: 04.10.2024

как вы преобразовать часовой пояс-знать объект datetime в эквивалентное номера-часовой пояс-в курсе datetime для местного часового пояса?

мое конкретное приложение использует Django (хотя на самом деле это общий вопрос Python):

это заставляет Django выдавать ошибку:

что бы SOME_FUNCTION быть?

в общем, чтобы преобразовать произвольный часовой пояс в наивный (локальный) datetime, я бы использовал pytz модуль astimezone для преобразования в местное время, и replace чтобы сделать datetime наивным:

но так как ваш конкретный datetime, похоже, находится в часовом поясе UTC, вы можете сделать это вместо этого:

кстати, вам может быть лучше хранить даты как наивные даты UTC, а не наивные локальные даты. Таким образом, данные являются агностическими по местному времени, и при необходимости преобразуются только в местное время или любой другой часовой пояс. Вроде как аналогично работе в unicode как можно больше, и кодирование только при необходимости.

поэтому, если вы согласны с тем, что хранение времени в наивном UTC-лучший способ, все, что вам нужно сделать, это определить:

Python предоставляет модуль datetime для работы с реальными датами и временем. Приложения функционируют в режиме настоящего времени, и Python позволяет нам запланировать запуск нашего скрипта Python в определенное время. В Python дата не является типом данных, но мы можем работать с объектами даты, импортировав модуль с именем datetime, time и calendar.

В этом разделе руководства мы обсудим, как работать с объектами даты и времени в Python.

Классы datetime подразделяются на шесть основных:

  • date – имеет формат стандартной даты. Состоит из года, месяца и дня как атрибутов.
  • time – это точное время, предполагающее, что в каждом дне ровно 24 * 60 * 60 секунд. В качестве атрибутов у него есть часы, минуты, секунды, микросекунды и tzinfo.
  • datetime – это группировка даты и времени вместе с атрибутами год, месяц, день, час, минута, секунда, микросекунда и tzinfo.
  • timedelta – представляет разницу между двумя датами, временем или экземплярами datetime с точностью до микросекунд.
  • tzinfo – предоставляет объекты информации о часовых поясах.
  • timezone – включен в новую версию Python. Это класс, который реализует абстрактный базовый класс tzinfo.

В Python время отсчитывается с 12 часов утра 1 января 1970 года. Функция time() модуля time возвращает общее количество тиков, потраченных с 12:00 1 января 1970 года. Tick можно рассматривать как наименьшую единицу измерения времени.

Рассмотрим следующий пример.

Как узнать текущее время?

Функции localtime() модуля времени используются для получения текущего кортежа времени. Рассмотрим следующий пример.

Кортеж времени

Время рассматривается как набор из 9 чисел. Давайте посмотрим на элементы временного кортежа.

Показатель Атрибут Значение
0 Год 4 цифры(например, 2018)
1 Месяц От 1 до 12
2 День От 1 до 31
3 Час От 0 до 23
4 Минуты От 0 до 59
5 Секунды От 0 до 60
6 День недели От 0 до 6
7 День года От 0 до 366
8 Перевод часов -1, 0, 1 или -1

Форматирование времени

Время можно отформатировать с помощью функции asctime() модуля времени. Он возвращает отформатированное время для переданного кортежа времени.

Время сна Python

Метод sleep() модуля time используется для остановки выполнения скрипта на заданный промежуток времени. Вывод будет задержан на количество секунд, указанное в качестве числа с плавающей запятой.

Рассмотрим следующий пример:

Модуль datetime

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

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

Рассмотрим следующий пример, чтобы получить представление об объекте datetime для текущего времени.

Создание объектов даты

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

Мы также можем указать время вместе с датой для создания объекта datetime. Рассмотрим следующий пример.

В приведенном выше коде мы последовательно передали в функцию datetime() атрибуты года, месяца, дня, часа, минуты и миллисекунды.

Сравнение двух дат

Мы можем сравнить две даты, используя такие операторы сравнения, как>,> =,

От автора: классы date, time и datetime предоставляют ряд функций для работы в Python с датами, временем и временными интервалами. Date и datetime являются объектами Python, поэтому, когда вы манипулируете ими, вы фактически манипулируете объектами, а не строками или временными метками. Всякий раз, когда вы манипулируете датами или временем, вам нужно импортировать функцию datetime.

Классы datetime в Python подразделяются на 5 основных классов.

date — работа с простой датой (месяц, день, год)

time — время, независимое от дня (час, минута, секунда, микросекунда)

datetime — комбинация времени и даты (месяц, день, год, час, секунда, микросекунда)


Получите курс и узнайте, как создать программу для перевода текстов на Python

timedelta — продолжительность времени, используемого для манипулирования датами

tzinfo— абстрактный класс для работы с часовыми поясами

В этом руководстве мы рассмотрим:

Как использовать классы Date и DateTime

Вывод даты с использованием date.today()

Текущая дата и время в Python: now() today()

Как отформатировать дату и время с помощью Strftime()

Как использовать Объекты Timedelta

Как использовать классы Date и DateTime

Шаг 1) Прежде чем запускать код для datetime, важно импортировать модули date time, как показано на скриншоте ниже.


Эти операторы импорта являются предопределенными частями функционала в библиотеке Python, которые позволяют вам манипулировать датами и временем без написания какого-либо кода. Рассмотрим следующее перед выполнением кода даты и времени:

Эта строка сообщает интерпретатору Python, что из модуля datetime импортируется класс date. Мы не пишем код для этого функционала, а просто импортируем его для использования.

Шаг 2) Далее мы создаем экземпляр объекта даты.


Шаг 3) Далее мы выводим дату и запускаем код.


Вывод соответствует ожидаемому.

Вывод даты с использованием date.today()

Функция date.today имеет несколько свойств, связанных с ней. Мы можем вывести отдельно день / месяц / год и многое другое. Давайте рассмотрим пример:


Сегодняшний номер дня недели

Функция date.today() также дает номер дня недели. Вот таблица рабочих дней, которая начинается с понедельника 0 и заканчивается воскресеньем 6.

Номер дня недели полезен для массивов, индекс которых зависит от дня недели.


Текущая дата и время в Python: now() today()


Когда мы выполняем код для datetime, он выдает выходные данные с текущей датой и временем.

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

Мы импортировали класс time. Мы присваиваем ему текущее значение времени, используя datetime.now(). Мы присваиваем значение текущего времени переменной t. И это даст нам только время. Итак, давайте запустим эту программу.


Вы можете видеть, что здесь у меня есть дата и время. А в следующей строке есть только время.

Шаг 3) Мы применим индексатор дня недели к массиву дней недели, чтобы узнать, какой сегодня день.


Вот полный код для получения текущей даты и времени, используя datetime.

Как отформатировать дату и время с помощью Strftime()

На данный момент мы узнали, как использовать в Python объекты datetime и date. Теперь мы узнаем, как использовать функцию форматирования времени и даты.

Шаг 1) Сначала мы рассмотрим, как отформатировать год. Вот пример:


Эта функция использует другой управляющий код для вывода.

Каждый управляющий код указывает различные параметры, такие как год, месяц, день недели и дата [(%y/%Y – Year), (%a/%A- weekday), (%b/%B- month), (%d - day of month)].



Получите курс и узнайте, как создать программу для перевода текстов на Python

Шаг 3) Функция Strf может объявлять отдельно дату, день, месяц и год. Также с небольшими изменениями в управляющем коде функции strftime вы можете отформатировать стиль текста.



%C — указывает местную дату и время

%x — указывает местную дату

%X — указывает местное время


В результате вы можете увидеть вывод, как и ожидалось.

Шаг 5) Функция strftime позволяет вам вызывать время в формате 24 часа или 12 часов.


Просто определив управляющий код, %I/H для часов, %M для минут, %S для секунд, можно вызвать время в разных форматах.

Время 12 часов объявляется, как [print now.strftime("%I:%M:%S %P)].

24 часа объявляется, как [print now.strftime("%H:%M")].

Вот полный код для преобразования datetime в объект String.

Как использовать Объекты Timedelta

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

Помните, что эта функция предназначена не для вывода времени или даты, а для того, чтобы ВЫПОЛНЯТЬ РАСЧЕТЫ в будущем или прошлом. Давайте рассмотрим пример.

Шаг 1) Чтобы запустить Объект Timedelta, вам нужно сначала объявить оператор импорта, а затем выполнить код:


Указываем оператор импорта для timedelta

Теперь указываем код для вывода объекта из timedelta, как показано на снимке экрана

Запустите код. Timedelta представляет промежуток 365 дней, 8 часов и 15 минут и выводит то же самое

Смешение? Об этом в следующем шаге.

Шаг 2) Давайте получим текущие дату и время, чтобы проверить, как работает наш оператор импорта. Когда код выполняется, он выводим сегодняшнюю дату, что означает, что наш оператор импорта работает хорошо.


Шаг 3) Посмотрим, как мы можем получить дату через год с помощью Объекта Timedelta. Когда мы запускаем код, он выдает результат, как и ожидалось.


Шаг 4) Еще один пример того, как Timedelta может использоваться для расчета будущей даты из текущей даты и времени.


Шаг 5) Давайте рассмотрим более сложный пример. Я хотел бы определить, сколько дней прошло в новом году. Вот как мы будем действовать.

Редакция Кодкампа

Python 3.2+ поддерживает формат %z при разборе строки в объекте datetime .

UTC в форме +HHMM или -HHMM (пустая строка, если объект не содержит информации о временной зоне).

Для других версий Python можно использовать внешнюю библиотеку, такую ​​как dateutil , которая проанализирует текст в объект datetime .

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

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

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

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

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

Арифметические операции для этих объектов поддерживаются только для одного и того же типа данных. Если выполнять арифметические действия с разными типами объектов, то это приведет к ошибке TypeError .

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

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

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

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

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

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

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

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

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

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

Все объекты datetime по умолчанию не относятся ни к одному часовому поясу. Чтобы привязать их к определенному часовому поясу — им нужно назначить объект tzinfo , который привязывает функцию даты и времени к стандарту UTC.

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

Для часовых поясов, которые фиксировано смещаются относительно UTC, в Python 3.2+ в модуле datetime есть класс timezone в котором реализован tzinfo , принимающий параметры timedelta и имя (необязательно):

Для Python-версий ниже 3.2 необходимо использовать стороннюю библиотеку. Например, dateutil . dateutil предоставляет эквивалентный класс tzoffset , который (tzoffset с версии 2.5.3) принимает аргументы вида dateutil.tz.tzoffset(tzname, offset) , где offset указано в секундах:

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

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

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

ВНИМАНИЕ. Начиная с версии 2.5.3, dateutil обрабатывает неоднозначные даты и всегда будет назначен по умолчанию для более поздней даты. Невозможно создать объект dateutil с текущим часовым поясом, например, 2015-11-01 1:30 EDT-4 , так как это происходит во время перехода на летнее время.

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

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

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

dt теперь является объектом datetime и вы увидите datetime.datetime(2047, 1, 1, 8, 21) .

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

Чтобы переключаться между часовыми поясами, вам нужны объекты datetime , в которых есть информация о часовом поясе.

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

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

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

Но для этих двух вариантов используется другой формат для strptime . Кроме того, strptime не поддерживает ни минуты, ни обозначения часовых поясов с минутами. Например, 2016-07-22 09: 25: 59 + 0300 проанализируется, а стандартный формат вида 2016-07-22 09:25:59 +03: 00 нет.

Существует библиотека из одного файла — iso8601 , которая правильно анализирует только временные метки ISO 8601.

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

Если часовой пояс не установлен, значение iso8601.parse_date соответствует UTC. Зона по умолчанию может быть изменена с помощью ключевого слова default_zone . Если вместо значения по умолчанию передаётся None , то тогда те значения даты и времени, у которых нет определенного часового значения, устанавливаются вместо простых значений даты и времени:

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

Модуль datetime может преобразовать метку POSIX timestamp в объект ITC datetime .

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

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

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

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

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

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

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

delta — это тип timedelta

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

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

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

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

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

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

Синтаксис

Параметры

Примечания

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

Тренажер

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

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

Работа с XML из Python

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

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

Читайте также: