У меня был другой формат ввода времени, так что вот более гибкое решение.
Конвертировать даты в BSD / macOS
date -jf in_format [+out_format] in_date
, где форматы используют strftime (см. man strftime
).
Для заданного формата ввода YYYY-MM-DD hh:mm:ss
:
$ date -jf '%Y-%m-%d %H:%M:%S' '2017-05-10 13:40:01'
Wed May 10 13:40:01 PDT 2017
Чтобы прочитать их в отдельных переменных, я беру идею NVRAM, но позволяю вам использовать любой формат strftime:
$ date_in='2017-05-10 13:40:01'
$ format='%Y-%m-%d %H:%M:%S'
$ read -r y m d H M S <<< "$(date -jf "$format" '+%Y %m %d %H %M %S' "$date_in")"
$ for var in y m d H M S; do echo "$var=${!var}"; done
y=2017
m=05
d=10
H=13
M=40
S=01
В сценариях всегда использовать read -r
.
В моем случае я хотел преобразовать часовые пояса (имена зон указаны в каталоге /usr/share/zoneinfo
):
$ format=%Y-%m-%dT%H:%M:%S%z
$ TZ=UTC date -jf $format +$format 2017-05-10T02:40:01+0200
2017-05-10T00:40:01+0000
$ TZ=America/Los_Angeles date -jf $format +$format 2017-05-10T02:40:01+0200
2017-05-09T17:40:01-0700
Конвертировать даты в GNU / Linux
На Mac вы можете установить версию GNU date
как gdate
с brew install coreutils
.
date [+out_format] -d in_date
, где out_format использует strftime (см. man strftime
).
В команде GNU coreutils date
нет способа явно установить формат ввода, так как он пытается выяснить формат ввода сам, и все обычно просто работает. (Подробно вы можете прочитать в руководстве по coreutils: форматы ввода даты .)
Например:
$ date '+%Y %m %d %H %M %S' -d '2017-05-10 13:40:01'
2017 05 10 13 40 01
Чтобы прочитать их в отдельные переменные, измените команду в разделе Mac, заменив команду в скобках на версию GNU.
Для преобразования между часовыми поясами (см. Каталог /usr/share/zoneinfo
для имен зон), вы можете указать TZ="America/Los_Angeles"
прямо во входной строке. Обратите внимание на буквенный символ "
вокруг имени зоны и символ пробела перед in_date:
TZ=out_tz date [+out_format] 'TZ="in_tz" 'in_date
Например:
$ format='%Y-%m-%d %H:%M:%S%z'
$ TZ=America/Los_Angeles date +"$format" -d 'TZ="UTC" 2017-05-10 02:40:01'
2017-05-09 19:40:01-0700
$ TZ=UTC date +"$format" -d 'TZ="America/Los_Angeles" 2017-05-09 19:40:01'
2017-05-10 02:40:01+0000
Дата GNU также понимает смещения часов для часового пояса:
$ TZ=UTC date +"$format" -d '2017-05-09 19:40:01-0700'
2017-05-10 02:40:01+0000