Вступление
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
преимущество, заключающееся в необходимости того, чтобы
пользователи активно искали его замену.
Все сводится к тому, насколько важны элементы даты и времени для вашего проекта и вашего кода.
\