2017-01-28 9 views
0

私は、 '2017010110'(形式は - %Y%m%d%Hのような)のようなデータを持つUNIXスクリプトの文字列変数を持っています。システムタイムスタンプではないことに注意してください。文字列をUNIXのタイムスタンプに設定する方法は?

今度は2017010110から-1時間を引く必要があります。出力が2017010109であることを意味します。変数から1を引いてみました。

しかし、入力が2017010100の場合、私は間違った出力2017010099(期待される出力は2016123123)になることは明らかです。

このように1時間の減算を行うには、文字列変数をUNIXのタイムスタンプに設定する必要があるようです。

私はConvert date time string to UNIX timestamp in bash commandを参照しましたが、運が見つかりませんでした。

誰か助けてくれますか?

+0

'GNU dateまたは' FreeBSD date'がありますか? – Inian

+0

こんにちは。 GNU日付が利用可能です。しかし、私は文字列変数を1時間を減算するために日付形式に設定する方法を知らない。 – user2531569

答えて

1

以下のコードを見てみましょう:このコードは、個々のフィールドにあなたのタイムスタンプを分割し、時間形式でGNU dateを供給し、それは理解し、1時間を削除し、出力に変数を設定します

#!/bin/bash 
ts="2017010100" 
d="[0-9]" 
if 
    [[ "$ts" =~ ($d$d$d$d)($d$d)($d$d)($d$d) ]] 
then 
    year="${BASH_REMATCH[1]}" 
    month="${BASH_REMATCH[2]}" 
    day="${BASH_REMATCH[3]}" 
    hour="${BASH_REMATCH[4]}" 
    timezone=EST 
    adjusted_ts="$(date -d "$year-$month-$day $hour:00:00 $timezone - 1 hour" "+%Y%m%d%H")" 
    echo "$adjusted_ts" 
else 
    echo "Invalid timestamp" 
fi 

をこのdateコマンド。コードはBash固有のものです(Bashの正規表現マッチングを使用しています)が、一般的な考え方を示しています。

結果を台無しに(おそらくUTCに関連する)オフセットのいくつかの種類があり、私は(少なくとも私のシステム上で)他のタイムゾーンを指定することを強制、またはされていますのでご注意ください。私は、「ローカル」タイムゾーンを指定して、システムのタイムゾーンをスティングに埋め込まなくても済むようにする方法を見つけられませんでした。これを改善し、コードをタイムゾーンに依存しないようにするための提案をいただければ幸いです。

関連する問題