web-dev-qa-db-ja.com

日付を別のタイムゾーンに変換+形式を変更

「22.09.201608: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
user3647376

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つの可能なアプローチは、$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")

編集:間違った変数名を持たないことは確かに役立ちます。

1
Seth

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"であり、2番目のコードスニペットの後に記載されている"+%Y:%m:%d %H:%M:%S"ではありません。そうしないと、上記のコードでsecが定義されている行で、illegal time formatエラーなどがスローされる可能性があります。

0
RAM237

これは少し見栄えが良く、NZ時間をモナコ時間に変換します。

TZ = "Europe/Monaco" date --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

0
P6039