У меня есть файл журнала с отметками времени в формате «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 ‘@’ 

2 ответа2

0

Не похоже, что 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")

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .