У меня есть файл журнала с временными метками в формате "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S"). Эта временная метка находится в часовом поясе UTC.
Теперь мне нужно преобразовать эту временную метку в временную метку Европы/Хельсинки с помощью скрипта bash.
У меня есть скрипт, который выполняет преобразование так, как мне нужно.
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "2015-05-20 18:05:02")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
Это работает нормально, но формат «ввода» даты (-d «2015-05-20 18:05:02») отличается от формата временной метки моего журнала.
Я хотел бы изменить этот сценарий на что-то вроде этого.
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
Где $1 может быть в исходном формате даты моего файла журнала "22.09.2016 08:22:54" ("+%Y:%m:%d %H:%M:%S").
Я не могу заставить это работать. Может ли кто-нибудь помочь мне с этим? Спасибо
РЕДАКТИРОВАТЬ:
Я пробовал что-то подобное и много других комбинаций.
#!/bin/sh
sec=$(TZ="UTC" date +'%s' "+%Y:%m:%d %H:%M:%S" -d "$1")
TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S"
но он заканчивается ошибкой..
date: extra operand ‘+%Y:%m:%d %H:%M:%S’
Try 'date --help' for more information.
date: invalid date ‘@’
решение1
Это не похожеdate
поддерживает строку формата ввода. Таким образом, вы не сможете просто пойти и передать строку в date. На странице руководства указано, что он принимает обычные форматы, так что, возможно, ваши настройки локали могут повлиять на это, но я в этом не уверен.
Давайте еще раз взглянем на ваш сценарий:
#!/bin/bash
sec=$(TZ="UTC" date +'%s' -d "$1")
$(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")
Здесь происходит следующее: вы преобразуете $1
параметр в временную метку Linux, а затем снова преобразуете его в нужную вам строку. Один из возможных подходов к тому, чтобы это работало с вашим вводом, — переформатировать строковый $1
параметр.
Вы можете сделать это в качестве примера, используя sed
с подходящим регулярным выражением. Будьте осторожны, вам следует убедиться, что у вас есть допустимая строка заранее, и что любые изменения формата могут сломать это.
#!/bin/bash
intputdate=$(echo $1 | sed -re 's/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/\3-\2-\1/')
sec=$(TZ="UTC" date +'%s' -d "$intputdate")
echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S")
Редактировать: Отсутствие неправильных имен переменных, безусловно, помогает.
решение2
Это выглядит немного лучше, конвертируя новозеландское время во время Монако:
TZ="Европа/Монако" дата --date="TZ=\"Тихий океан/Окленд\" 2017-10-11 00:51" +%Y-%m-%d\ %H:%M:%S
2017-10-10 13:51:00
#!/bin/bash
new_zealand_time="2017-10-12 00:56"
monaco_time=$(TZ="Europe/Monaco" date --date="TZ=\"Pacific/Auckland\" $new_zealand_time" +%Y-%m-%d\ %H:%M:%S)
echo "Time in Monaco: $monaco_time"
Время в Монако: 2017-10-11 13:56:00
решение3
На MacOS (10.14.3) работает довольно хорошо, так как вы можете указать свой точный формат с помощью -f
переключателя:
$ d1="22.09.2016 08:22:54"
$ sec=$(TZ="UTC" date -j -f "%d.%m.%Y %H:%M:%S" "$d1" "+%s")
1474532574
$ TZ="Europe/Helsinki" date -j -f "%s" "$sec" "+%Y:%m:%d %H:%M:%S"
2016:09:22 11:22:54
и, кстати, ваш формат журнала — это "+%d.%m.%Y %H:%M:%S"
, а не "+%Y:%m:%d %H:%M:%S"
тот, который вы указали после второго фрагмента кода, в противном случае строка, где sec
определено в моем коде выше, скорее всего, выдаст illegal time format
ошибку или что-то в этом роде.