Преобразование даты в другой часовой пояс + изменение формата

Преобразование даты в другой часовой пояс + изменение формата

У меня есть файл журнала с временными метками в формате "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ошибку или что-то в этом роде.

Связанный контент