Работа с Datetime в Python со стрелкой

Введение Arrow [https://arrow.readthedocs.io/en/latest/] - это модуль Python для работы с датой и временем. Учитывая, что есть несколько модулей, которые делают это, в первую очередь встроенный модуль datetime, что отличает Arrow? В частности, библиотека основана на Moment.js [https://github.com/moment/moment], библиотеке JavaScript, которая переопределяет реализацию по умолчанию API даты / времени. В этом руководстве мы рассмотрим некоторые ключевые особенности Arrow, чтобы увидеть, как он обрабатывает сертификаты.

Вступление

Arrow - это модуль Python для работы с датой и временем. Учитывая, что есть несколько модулей, которые делают это, в первую очередь встроенный datetime , что отличает Arrow?

В частности, эта библиотека вдохновлена Moment.js , библиотекой JavaScript, которая переопределяет реализацию по умолчанию API даты / времени.

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

Во-первых, давайте установим его:

 $ pip install Arrow 

Класс Arrow

Класс Arrow - это реализация datetime с дополнительными функциями. Кроме того, по умолчанию используется часовой пояс , но мы поговорим об этом чуть позже.

Вы можете легко создать новый Arrow , снабдив его конструктор несколькими аргументами:

 import arrow 
 arrow_object = arrow.Arrow(2021, 1, 1) 
 print(arrow_object) 

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

 2021-01-01T00:00:00+00:00 

Вы также можете указать часы, минуты и секунды через конструктор:

 import arrow 
 arrow_object = arrow.Arrow(2021, 1, 1, 14, 30, 21) 
 print(arrow_object) 

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

 2021-01-01T14:30:21+00:00 

Поддержка преобразования со стрелкой

Анализ даты и времени из строки - это простой процесс с помощью Arrow - вы просто используете метод get() и предоставляете ему допустимый строковый формат. Кроме того, Arrow позволяет легко конвертировать между собственной реализацией datetime и встроенным объектом datetime

Преобразовать строку в Datetime с помощью стрелки

Если строка уже отформатирована в формате ISO 8601 ( YYYY-MM-DDTHH:MM:SS.mmmmmm ), ее можно передать непосредственно в метод get() :

 import arrow 
 datetime = arrow.get('2021/03/30 12:05') 
 print(datetime) 

Это распечатает Arrow , который является собственной реализацией Arrow интерфейса datetime

 <Arrow [2021-03-30T12:05:00+00:00]> 

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

К счастью, мы все еще можем анализировать строки, которые не соответствуют соглашениям, используя правильные токены формата Arrow . Они предопределены и предоставляют Стрелке информацию, необходимую для правильного анализа строки:

 import arrow 
 datetime = arrow.get('March 30 2021 12:05', 'MMMM DD YYYY HH:mm') 
 print(datetime) 

Здесь мы эффективно рассказали Стрелке, что это за формат. Он сопоставляет предоставленные токены формата со строкой, которую мы хотим проанализировать, и создает Arrow на основе этой информации. Выполнение этого приводит к:

 <Arrow [2021-03-30T12:05:00+00:00]> 

Преобразование между объектами Arrow и datetime

До сих пор мы работали с экземплярами Arrow Однако многие приложения и библиотеки явно требуют использования объекта datetime Преобразование между этими двумя форматами имеет решающее значение.

Давайте посмотрим на type() нашей переменной:

 type(datetime) 

Выход:

 arrow.arrow.Arrow 

Чтобы преобразовать это в datetime , мы просто извлекаем поле datetime из объекта Arrow

 datetime = datetime.datetime 
 print(datetime) 

Это приводит к экземпляру datetime

 datetime.datetime(2021, 3, 12, 12, 5, tzinfo=tzutc()) 

Несмотря на то, что мы не указали часовой пояс при создании исходного объекта Arrow datetime имеет значение tzinfo умолчанию в формате UTC. Мы вернемся к этому в следующем разделе, когда более подробно рассмотрим обработку часовых поясов.

На данный момент мы можем подтвердить, что это действительно объект типа datetime

 type(now) 

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

 datetime.datetime 

Точно так же вы можете легко преобразовать объекты datetime Arrow , используя fromdatetime() :

 datetime = datetime.datetime(2021, 1, 1, 0, 0) 
 arrow_object = arrow.Arrow.fromdatetime(datetime) 
 print(arrow_object) 

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

 2021-01-01T00:00:00+00:00 

Работа с часовыми поясами

Одна из основных проблем с datetime - способ обработки часовых поясов. Считается, что он не зависит от часового пояса , то есть не содержит данных, связанных с часовым поясом. Arrow, с другой стороны, содержит tzinfo для каждого экземпляра, который вы можете установить с помощью конструктора или методов. По tzinfo значение UTC, независимо от местонахождения пользователя.

На практике это означает, что с datetime пользователь в Гонконге будет работать по местному гонконгскому времени, тогда как пользователь в Великобритании будет работать по местному времени Великобритании - если не указано иное:

 import datetime 
 datetime.datetime.now() 

Результатом для пользователя из Гонконга будет:

 datetime.datetime(2021, 3, 31, 00, 35, 08, 114203) 

В то время как кто-то из Великобритании увидит:

 datetime.datetime(2021, 3, 30, 17, 35, 25, 119213) 

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

Независимо от географического положения пользователя следующие строки кода дадут одинаковый результат:

 arrow.now() 

Выход:

 <Arrow [2021-03-30T17:37:28.374335+01:00]> 

Мы можем подтвердить, что это соответствует времени UTC:

 arrow.utcnow() 

Выход:

 <Arrow [2021-03-30T16:37:59.721766+00:00]> 

Мы можем установить часовые пояса в Arrow просто передав строку часового пояса в его конструктор:

 arrow.now('US/Pacific) 

Это работает вместе с другими параметрами, которые мы использовали раньше. Установка часового пояса при создании Arrow работает как для преобразования строк и datetime и для явного вызова конструктора:

 import arrow 
 import datetime as datetime 
 
 
 date = '2021.01.01 00:00' 
 datetime = datetime.datetime(2021, 1, 1, 0, 0) 
 
 arrow_1 = arrow.Arrow(2021, 1, 1, 0, 0, tzinfo='US/Pacific') 
 arrow_2 = arrow.get(date, tzinfo='US/Pacific') 
 arrow_3 = arrow.Arrow.fromdatetime(datetime, tzinfo='US/Pacific') 
 
 print(arrow_1) 
 print(arrow_2) 
 print(arrow_3) 

Теперь эти Arrow будут настроены на US/Pacific и установлены на 1 января 2021 года:

 2021-01-01T00:00:00-08:00 
 2021-01-01T00:00:00-08:00 
 2021-01-01T00:00:00-08:00 

Как видите, объекты теперь имеют -08:00 , поскольку US/Pacific 8 часов отстает от UTC.

Вы также можете извлечь наивные версии этих дат, вызвав их naive поле:

 print(arrow_1.naive) 
 print(arrow_2.naive) 
 print(arrow_3.naive) 

Это не лишит их осведомленности о часовом поясе, в результате чего вы ожидаете, когда работаете с наивными объектами datetime

 2021-01-01 00:00:00 
 2021-01-01 00:00:00 
 2021-01-01 00:00:00 

Преобразование часового пояса с помощью стрелки

Еще одна область, на которую стоит обратить внимание, - это то, как мы можем конвертировать между разными часовыми поясами с помощью Arrow, используя метод to() . Хотя Arrow полностью совместим с модулями часовых поясов, нет необходимости импортировать какие-либо дополнительные модули для преобразования часовых поясов.

Для начала мы можем получить текущее время и присвоить его переменной:

 utc=arrow.now() 
 print(utc) 

 <Arrow [2021-03-30T17:41:08.765166+01:00]> 

Теперь давайте преобразуем этот объект в другой часовой пояс:

 utc.to('US/Pacific') 

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

 <Arrow [2021-03-30T09:41:08.765166-07:00]> 

Или время в Гонконге:

 utc.to('Asia/Hong_Kong') 

 <Arrow [2021-03-30T09:41:08.765166-07:00]> 

Мы даже можем указать разницу во времени с количеством часов:

 utc.to('-05:00') 

Это гораздо более интуитивно понятный способ преобразования часовых поясов, особенно если у вас нет под рукой списка подходящих имен:

 <Arrow [2021-03-30T11:41:08.765166-05:00]> 

Очеловечивание и перенос свиданий

Часто, имея дело с промежутками времени, свидание действительно не нужно. В разговоре с коллегами мы говорим:

«Вчера ходил по магазинам».

Нет:

«Я ходил по магазинам 2021/12/03», то есть за день до 2021/12/04 », то есть прямо сейчас.

Во многих случаях вы можете захотеть очеловечить даты, например, аннотировать, когда пришло уведомление, было отправлено электронное письмо или когда кто-то выполнил определенное зарегистрированное действие. К счастью, Arrow позволяет нам действительно легко очеловечить любую дату с помощью функции humanize() .

Эта функция творит чудеса с функцией shift() , которая может сдвигать даты на 0...n дней. Возможно, вы захотите создать систему, которая уведомляет человека о приближении определенной даты, говоря человеческим языком :

 import arrow 
 
 now = arrow.now() 
 tomorrow = now.shift(days=1) 
 yesterday = now.shift(days=-1) 
 next_week = now.shift(days=7) 
 notification = now.shift(days=-2, hours=-5, minutes=-7) 
 
 print(now.humanize()) 
 print(tomorrow.humanize()) 
 print(yesterday.humanize()) 
 print(next_week.humanize()) 
 print(notification.humanize(granularity=['day', 'hour', 'minute'])) 

Здесь мы создали Arrow с помощью функции now() . Затем мы создали серию объектов, сдвинув значения вверх или вниз. Функция shift() принимает такие аргументы, как years , months , days , hours , minutes и seconds . Мы создали объект " tomorrow и " yesterday , перемещаясь вверх и вниз на один день (не на месте), а также объект для next_week и произвольный notification который произошел 2 дня, 5 часов и 7 минут назад.

Наконец, при очеловечивании вы можете указать granularity , которая позволяет Arrow знать, насколько подробным должен быть отчет о времени на человеческом языке. По умолчанию он устанавливает гранулярность на day и / или week , в зависимости от временного диапазона. В нашем случае мы оставили настройки по умолчанию включенными, за исключением последнего объекта, для которого мы специально хотим более тонкую детализацию:

 just now 
 in a day 
 a day ago 
 in a week 
 2 days 5 hours and 7 minutes ago 

Это очень интуитивный и человеческий способ представления даты для вашего пользователя - например, отсчета дней до события или подсчета дней от события.

Преимущества использования стрелки

Преимущества использования Arrow можно резюмировать с официальными заявлениями из их документации:

Разумный и дружелюбный к человеку подход.

Поддержка многих распространенных сценариев создания.

Помогите вам работать с датой и временем с меньшим количеством операций импорта и кода.

В них, похоже, это удается, и Arrow преодолевает основные проблемы с библиотекой datetime Из того, что мы видели в наших примерах выше, Arrow, безусловно, является улучшением с точки зрения:

  • Снижение потребности в импорте нескольких модулей
  • Работа только с одним типом данных (стрелка)
  • Знание часового пояса
  • Упрощение создания наиболее часто используемых функций даты и времени
  • Легкое преобразование между различными типами
  • Полезные функции гуманизации
  • Легко переносить ценности в прошлое и будущее

Заключение

В этом руководстве мы сосредоточились на некоторых преимуществах использования библиотеки Arrow для работы с датой и временем в Python. Он вдохновлен Moment.js и предлагает решения некоторых известных проблем библиотеки datetime

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

Все сводится к тому, насколько важны элементы даты и времени для вашего проекта и вашего кода.

\

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus