日付を別のタイムゾーンに変換 + フォーマット変更

日付を別のタイムゾーンに変換 + フォーマット変更

「22.09.2016 08:22:54」(「+%Y:%m:%d %H:%M:%S」) という形式のタイムスタンプを持つログ ファイルがあります。このタイムスタンプは UTC タイムゾーンです。

ここで、bash スクリプトを使用してこのタイムスタンプを Europe/Helsinki タイムスタンプに変換する必要があります。

希望通りの変換を行うスクリプトがあります。

#!/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")

ここで行われるのは、パラメータを Linux タイムスタンプに変換し$1、それを再度必要な文字列に変換することです。入力でこれを機能させるための 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")

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

答え2

ニュージーランド時間をモナコ時間に変換すると、見た目が少し良くなります。

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

答え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"2 番目のコード スニペットの後に記載されている形式ではありません。そうでない場合、上記のコードで が定義されている行でエラーなどがsecスローされる可能性があります。illegal time format

関連情報