如何比較兩個時間戳記?

如何比較兩個時間戳記?

我有兩個時間戳,一個是這樣的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 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
    
  3. 使 busybox 日期列印以秒為單位的值(自紀元以來):

    $ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s'
    1490314449
    

D2

您也可以對第二個時間戳重複該過程,但是在這種情況下,該字串將直接由日期理解:

$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129

busybox 日期刪除了奈秒 ( ${d2%.*})(稍後會詳細介紹):

$ busybox date -u -d "${d2%.*}" +'%s'
1490421129

差異

您應該已經在兩個變數中捕獲了上面的結果:

$ 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

奈秒

如果您還需要比較納秒,則會出現三個問題。

  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. 第二個日期有奈秒。在這種情況下,第二個日期具有 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
    
  3. 並且,您執行的 bash 需要能夠處理 64 位元整數。
    如果是這樣,計算差值:

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

    略高於 106,000 秒(約 29 小時):

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

相關內容