2つのタイムスタンプを比較するには?

2つのタイムスタンプを比較するには?

2つのタイムスタンプがあります。一つは、24MAR17:00:14:09もう一つはそうです2017-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

主な問題は、提供された文字列を解析することです。日付コマンドは、完全形式ではなく特定の形式のみを受け入れます。解決策は、(ほぼ)日付を受け入れるbusyboxの機能を利用することです。どの滞在。

D1

  1. 指定された形式と同じ形式で日付を印刷する形式文字列を作成します。

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. この文字列を使用して、busyboxの日付に日付文字列を解析する方法を教えてください。ローカル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
    
  3. ビジボックスの日付を秒単位で値を印刷します(エポック以降)。

    $ 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の日付にnanoseconds()が削除されました${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つの問題が発生します。

  1. 最初の値にはナノ秒はありません。最初のものは、最初の日付にナノ秒値がないことです。
    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番目の日付はナノ秒です。この場合、2番目の日付は日付が直接処理できる形式ですが、busyboxの日付で前処理する必要がある形式がある場合は、後でナノ秒を追加する必要があります。たとえば、

    $ d2='2017-03-25 05:52:09.373941000'
    $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}"
    $ echo "$resd2"
    1490421129373941000
    
  3. また、実行中のbashは64ビット整数を処理できる必要があります。
    それでは違いを計算してみてください。

    $ echo "(( $resd2 - $resd1 ))"
    (( 1490421129373941000 - 1490314449000000000 ))
    
    $ echo "$(( $resd1 - $resd2 ))"
    106680373941000
    

    106,000秒を少し超える時間(約29時間):

    $ echo "$(( ($resd2 - $resd1)/10**9 ))"
    106680
    

関連情報