Bash:
Анализ даты из строки
Как это сделать:
Использование date с +%Y-%m-%d дает нам форматированный вывод:
date_str="Jan 01 2023"
formatted_date=$(date -d "$date_str" '+%Y-%m-%d')
echo $formatted_date2023-01-01date -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