Bash:
Анализ даты из строки
Как это сделать:
Использование date
с +%Y-%m-%d
дает нам форматированный вывод:
date_str="Jan 01 2023"
formatted_date=$(date -d "$date_str" '+%Y-%m-%d')
echo $formatted_date
2023-01-01
date -d
позволяет нам разобрать нашу строку, в то время как +%Y-%m-%d
определяет формат вывода.
Глубокое погружение
Сам Bash не очень хорош в разборе дат. Исторически, в системах Unix не было встроенной поддержки для этого. В большинстве случаев скрипты полагались на внешние инструменты или сложные обходные пути. GNU date
изменил правила игры с его опцией -d
, позволяющей легко разбирать даты и форматировать вывод.
Альтернативы? Конечно, есть awk
, sed
, и perl
. У каждого свой подход к решению проблемы, но date
обычно является первым выбором из-за простоты.
Детали реализации становятся более интересными. date
по умолчанию использует системные настройки локали, что влияет на интерпретацию ввода. Может потребоваться переопределение локали для обеспечения последовательного поведения в разных средах. К тому же, обработка дат до 1970 года или после 2038? Вот где могут появиться проблемы из-за ограничений временной метки Unix.
Смотрите также
- Страница руководства GNU
date
: https://www.gnu.org/software/coreutils/manual/html_node/date-invocation.html - Больше о временной метке Unix и проблеме 2038 года: https://en.wikipedia.org/wiki/Year_2038_problem
- Разбор дат в
awk
: https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html