Конвертировать дату в другой часовой пояс + изменение формата
У меня есть файл журнала с отметками времени в формате "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 ‘@’
3 ответа
Это не похоже 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]{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")
Изменить: Неправильные имена переменных, безусловно, помогает.
На 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"
после 2-го фрагмента кода, в противном случае строка где sec
определено в моем коде выше, скорее всего, бросить illegal time format
ошибка или что-то в этом роде.
Это выглядит немного лучше, переводя время Новой Зеландии в время Монако:
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