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

3018
user3647376

У меня есть файл журнала с отметками времени в формате «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 ‘@’  
0
Вы пытались установить формат для первой строки? Seth 7 лет назад 0
yes.. I have tried this.. #!/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" but his ends up with error.. date: extra operand ‘+%Y:%m:%d %H:%M:%S’ Try 'date --help' for more information. date: invalid date ‘@’ user3647376 7 лет назад 0

2 ответа на вопрос

0
Seth

Не похоже, dateподдерживает строку формата ввода. Таким образом, вы не сможете просто пойти дальше и передать строку на сегодняшний день. Страница man заявляет, что она принимает обычные форматы, так что, возможно, настройки вашего языка могут повлиять на это, но я не уверен в этом.

Далее, давайте посмотрим на ваш скрипт:

#!/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])\.([0-9])\.([0-9])/\3-\2-\1/') sec=$(TZ="UTC" date +'%s' -d "$intputdate") echo $(TZ="Europe/Helsinki" date -d "@$sec" "+%Y:%m:%d %H:%M:%S") 

Изменить: Неправильные имена переменных, безусловно, помогает.

0
P6039

Это выглядит немного лучше, конвертируя время Новой Зеландии в время Монако:

TZ = "Европа / Монако" дата --date = "TZ = \" Pacific / Auckland \ "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

Прочитайте [«Зачем мне нужно 50 репутации, чтобы комментировать»] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i -до-вместо), чтобы убедиться, что вы понимаете, как вы можете начать комментировать. Pimp Juice IT 6 лет назад 0

Похожие вопросы