%Y%m%d%H%M%S形式の文字列に時間を追加する方法

%Y%m%d%H%M%S形式の文字列に時間を追加する方法

私のシェルスクリプトを見てください

#!/bin/sh
aaa=20200101101010
bbb=$(date -d "$aaa -5 minutes" +'%Y%m%d%H%M%S')

echo $bbb

私は欲しい:

20200101100510

しかし、結果は次のようになります。

20200101101009235500

どうしたの?

aaaから5分を引くには?

見たい 20200101100510

答え1

dateこれを現地時間20200101101010として解釈するGNU実装を使用する必要があります。2020010110-10-10T00:00:00

-dはい、非標準オプションdate、いくつかの実装でのみサポートされており、それをサポートする実装で日付を入力したい場合(たとえば、GNU、busybox、ast-open date、BSDは代わりにdate使用)、他の実装ではそこにあります。は違います。-r-v

ast-openまた、busyboxを使用すると、オフセットAFAIKがなくてもdate入力形式(busybox with -D、ast-open with)を指定できます。-pただし、最初にエポック時間に変換して5分を削除し、300秒を削除してから、希望の形式に変換することもできます。

2019年7月、GNUに似たものを追加しようという提案がありました。dateしかし、まだリリースされていません(2020-01-21基準)。

特に、GNUの場合、dateまず$aaainput()を認識可能な形式に変換できます。@RakeshShewaleのksh93文法アプローチ

zsh別のオプションは、埋め込み不可能な動作に依存せずにタイムスタンプ解析と書式設定機能を備えたシェルを使用することですdate

zmodload zsh/datetime || exit
format=%Y%m%d%H%M%S min=60

aaa=20200101101010

strftime -r -s bbb -- "$format" "$aaa" || exit
strftime    -s bbb -- "$format" "$((bbb - 5 * min))"
print -r -- "$bbb"

$format他のフォーマットに対して必要に応じて調整できますが、すべてのフォーマットディレクティブがサポートされているわけではありませんstrftime()strftime-r滞在タイムスタンプ)strptime()(発信者strftime -r分析するタイムスタンプ)。man 3 strftimeシステムを確認してくださいman 3 strptime

答え2

a=20200101101010
bbb=$(date --date "${a:0:4}-${a:4:2}-${a:6:2} ${a:8:2}:${a:10:2}:${a:12:2}")
ccc=$(date -d "$bbb -5 mins" +'%Y%m%d%H%M%S')
echo $ccc

出力:

20200101100510

関連情報