Сценарий оболочки для преобразования строки даты в указанный c формат отметки времени - PullRequest
0 голосов
/ 18 марта 2020

У меня есть строка даты и времени, подобная этой 17-Mar-2020.22:22 -0300. Я хочу получить вывод как 2020-03-17 22:12.

Смещение часового пояса вызывает проблему, так как без этого я могу конвертировать

Например DATE=17-Mar-2020.22:22 date -jf "%d-%b-%Y.%H:%M" $DATE "+date \"%Y-%m-%d %H:%M\""

Но это смещение часового пояса вызывает проблему. Может кто-нибудь помочь?

1 Ответ

0 голосов
/ 19 марта 2020

Поскольку ввод в необычном формате, его необходимо сначала отформатировать в формате date. Я использую формат, указанный в справочной странице "2004-02-29 16:21:42" или "Sun, 29 Feb 2004 16:21:42 -0800". GNU date допускает очень гибкий формат ввода - не доверяйте ему.

Ниже я использовал sed для сопоставления ввода и его переформатирования.

input='17-Mar-2020.22:22 -0300'
input2="$(sed 's/\([0-9]*\)-\([^-]*\)-\([^\.]*\)\.\([0-9]*\):\([0-9]*\)/\1 \2 \3 \4:\5:00/' <<<"$input")"
# input2="17 Mar 2020 22:22:00 -0300"
date --date="$input2" +"%Y-%m-%d %H:%M"
# 2020-03-18 02:22

date -jf

Дата GNU сильно отличается от Дата BSD . Они совершенно разные. Дата BSD поддерживает опции -j и -f, дата GNU - нет.

Есть dateutils , и они включают в себя утилиту strptime, которая позволяет делать то, что вы хотели сделать с дата:

strptime -e -f "%Y-%m-%d %H:%M\n" -i "%d-%b-%Y.%H:%M %Z" "17-Mar-2020.22:22 -0300"
...