
我有兩個時間戳,一個是這樣的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
建立一個格式字串,以與提供的格式相同的格式列印日期:
$ 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 日期列印以秒為單位的值(自紀元以來):
$ 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
奈秒
如果您還需要比較納秒,則會出現三個問題。
第一個值沒有納秒。第一個是第一個日期沒有納秒值。
您可以附加 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
第二個日期有奈秒。在這種情況下,第二個日期具有 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