Вопрос или проблема
Я могу выполнять некоторые арифметические операции с датами с помощью команды date
, например
$ date -u -d '3 days 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
2024-12-04T05:00:00Z
$
Команда date
может разбирать достаточно много форматов дат, включая форматы ISO-8601. Есть ли простой способ заставить ее интерпретировать также интервалы ISO-8601? Наивный подход не срабатывает…
$ date -u -d 'PT3D 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
date: invalid date ‘PT3D 2024-12-01T00:00:00Z’
$
Стандартная утилита date
не поддерживает опцию -d
. Есть несколько реализаций, которые поддерживают, но иногда для совершенно разных вещей.
Несколько из них (включая некоторые BSD, хотя у них есть свой другой синтаксис для этого) имеют -d
, чтобы указать входную дату, в отличие от того, чтобы брать системные часы, следуя примеру GNU date
, но формат ввода, который они распознают, отличается между ними. Некоторые из них позволяют задавать формат ввода в стиле strptime()
(ast-open, busybox, toybox), другие нет (GNU, NetBSD¹).
Среди реализаций date
, поддерживающих -d
для указания входной даты, я знаю только о ast-open
(AT&T Software Technology из AT&T Research, ранее известной как Bell Labs, где родился Unix), которая поддерживает продолжительности ISO8601. Но ast-open больше не поддерживается, насколько я знаю.
Тем не менее, ksh93
, который использует ту же библиотеку для манипуляций с датами, по-прежнему поддерживается, и вы можете использовать его встроенный printf
, чтобы выполнить эквивалент GNU date -d
:
$ TZ=UTZ0 printf '%(%FT%TZ)T\n' '2024-12-01T00:00:00Z PT3D'
2024-12-04T00:00:00Z
Имейте в виду, что его обработка DST при вычислении дат все еще довольно ошибочна, хотя это не относится к датам UTC.
¹ Хотя NetBSD, как и другие BSD, позволяет указывать формат ввода, если использовать способ указания даты ввода в стиле BSD.
Ответ или решение
Интервалы ISO 8601 в арифметике дат с использованием команды date
В современном мире дата и время играют ключевую роль в программировании и анализе данных. Команда date
, доступная во многих Unix-подобных системах, предоставляет возможности для выполнения различных операций с датами, включая арифметику над датами. Однако, несмотря на свою мощь, date
имеет некоторые ограничения в поддержке формата ISO 8601 для интервалов.
Основы работы с командой date
Команда date
может обрабатывать множество форматов дат, включая форматы ISO-8601. Ваша команда:
$ date -u -d '3 days 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
2024-12-04T05:00:00Z
продемонстрировала, как можно проводить арифметику, добавляя к конкретной дате определённый промежуток. Но попытка использовать интервалы ISO 8601 с командой:
$ date -u -d 'PT3D 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
date: invalid date ‘PT3D 2024-12-01T00:00:00Z’
показала, что такой формат не поддерживается.
Проблемы с интервалами ISO 8601
Команда date
не обрабатывает интервалы ISO 8601 (например, PT3D
для трёх дней) как ожидается из-за недостатков в реализации широкой поддержки подобных временных интервалов. Разные реализации команд date
могут также различаться в поддержке опции -d
, которая позволяет указывать входную дату. В большинстве случаев, имеющиеся реализации (например, GNU date
, BSD date
и другие) имеют ограниченные возможности и могут не поддерживать стандартные форматы ISO 8601 для интервалов.
Решение через ksh93
Одним из решений этой проблемы является использование оболочки ksh93
, которая поддерживает арифметику над датами через встроенную команду printf
. Этот подход особенно полезен, если вы работаете в среде, где доступ к GNU date
ограничен, или если вам нужно использовать интервалы ISO 8601. Пример использования:
$ TZ=UTZ0 printf '%(%FT%TZ)T\n' '2024-12-01T00:00:00Z PT3D'
2024-12-04T00:00:00Z
В этом примере вы можете видеть, что использование ksh93
позволяет легко работать с интервалами ISO 8601.
Заключение
Работа с датами и временем в Unix-подобных системах может представлять некоторые сложности, особенно при использовании стандартных команд для арифметики с датами. Хотя date
является мощным инструментом, его возможности ограничены в отношении форматов ISO 8601 для интервалов. Используя оболочку ksh93
, вы можете значительно расширить функционал, что позволяет вам работать с датами и интервалами более гибко и точно. Если ваша работа связана с манипуляцией датами и временем, рекомендуется рассмотреть возможность использования ksh93
как альтернативы.
Таким образом, выбор подходящего инструмента в зависимости от задач и требований проекта может существенно повлиять на эффективность вашей работы с данными.