
タイムスタンプが 2 つあり、1 つはこれ24MAR17:00:14:09
、もう 1 つはこれです。22017-03-25 05:52:09.373941000
つのタイムスタンプが同じかどうかを比較したいのですが、日付関数と awk 関数をたくさん試しましたが、何も結果が得られません。助けてください。
答え1
バッシュ解決:
#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'
d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"
if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then
echo "dates are equal"
else
echo "dates are unequal"
fi
答え2
これを試して、
時間を2017-03-25 05:52:09.373941000
最初の形式に変換して24MAR17:00:14:09
から比較することができます。
date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" | tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
答え3
主な問題は、提供された文字列を解析することです。コマンドdateは、すべての形式ではなく、一部の形式のみを受け入れます。解決策は、busyboxの日付機能を利用して、(ほぼ)どれでもフォーマット。
D1
指定された形式と同じ形式で日付を出力するフォーマット文字列を作成します。
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
その文字列を使用して、busybox date に日付文字列を解析する方法を伝えます。ローカル TZ によって結果が変わる可能性があることに注意してください。間違いを避けるために -u (UTC) を使用するか、解析する時刻の文字列に正しい TZ を設定するようにしてください。
$ d1='24MAR17:00:14:09' $ busybox date -u -D '%d%b%y:%T' -d "$d1" Fri Mar 24 00:14:09 UTC 2017
busybox date に秒数(エポックからの秒数)の値を印刷させます。
$ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s' 1490314449
D2
2 番目のタイムスタンプに対してもこの手順を繰り返すことができますが、この場合、文字列は日付によって直接認識されます。
$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129
そして、busybox date からナノ秒 ( ${d2%.*}
) を削除します (これについては後で詳しく説明します)。
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
差分
上記の結果は、次の 2 つの変数で取得されているはずです。
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"
次に、差を計算してゼロと比較します。
$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different
または、文字列(値ではなく)を直接比較します。
$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different
ナノ秒
ナノ秒単位で比較する必要がある場合、3 つの問題があります。
最初の値にはナノ秒がありません。最初の日付にはナノ秒の値がありません。9
個のゼロを追加できます。$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')" $ resd1="$resd1""$(printf '%0*d' 9 0)" $ echo "$resd1"echo "$resd2 - $resd1" 1490314449000000000
または、(より良い方法として) 日付を使用して値を再処理します。
$ resd1="$(date -u -d "@$resd1" +'%s%N')" $ echo "$resd1" 1490314449000000000
2 番目の日付にはナノ秒があります。この場合、2 番目の日付は date が直接処理できる形式ですが、busybox date による事前処理が必要な形式の場合は、後でナノ秒を追加する必要があります。例:
$ d2='2017-03-25 05:52:09.373941000' $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}" $ echo "$resd2" 1490421129373941000
また、実行している bash は 64 ビット整数を処理できる必要があります。
その場合は、差を計算します。$ echo "(( $resd2 - $resd1 ))" (( 1490421129373941000 - 1490314449000000000 )) $ echo "$(( $resd1 - $resd2 ))" 106680373941000
これは 106,000 秒強 (約 29 時間) です。
$ echo "$(( ($resd2 - $resd1)/10**9 ))" 106680