ISO 8601 интервалы в арифметике дат с помощью команды date

Вопрос или проблема

Я могу выполнять некоторые арифметические операции с датами с помощью команды 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 как альтернативы.

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

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

Капча загружается...