web-dev-qa-db-ja.com

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

タイムスタンプが2つあります。1つはこのようなものです24MAR17:00:14:09と別のものはこのような2017-03-25 05:52:09.373941000と2つのタイムスタンプを同じに比較したいかどうか、たくさんの日付関数とawk関数を試しましたが、結果が得られないので助けてください。

2
Rahul

これを試して、

時間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"
1
ss_iwe

bashソリューション:

#!/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
1
RomanPerekhrest

主な問題は、提供された文字列を解析することです。コマンドdateは、すべてではなく一部の形式のみを受け入れます。解決策は、busyboxの(ほぼ)any形式を受け入れる日付機能を利用することです。

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日付を作成します(エポック以降)。

    $ 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の日付(${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. 最初の値にはナノ秒はありません。 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
    

    これは10万6千秒強(約29時間)です。

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