我有兩個日期,格式如下:YYYYMMDDHH并且想要計算這兩個日期之間的差異(以小時為單位)。例如
start_date=1996010100
end_date=1996010122
它代表兩個日期:1996-01-01 00:00:00 和 1996-01-01 22:00:00。我想用date小時來計算差異,結果應該是22小時。我試過了
START=$(date -d "$start_date" "%s")
END=$(date -d "$end_date" "%s")
HOURS=$(bc -l <<< "($END - $START) / 3600")
但它失敗了......那我該怎么做呢?謝謝!
uj5u.com熱心網友回復:
代表兩個日期:1996-01-01 00:00:00
因此,如果它代表它,請將其轉換為該形式。
start_date=1996010100
start_date=$(sed -E 's/(....)(..)(..)(..)/\1-\2-\3 \4:00:00/' <<<"$start_date")
start=$(date -d "$start_date" "%s")
和結束一樣。
uj5u.com熱心網友回復:
最簡單的方法是使用此命令安裝“dateutils”
sudo apt-get install dateutils
運行以下命令以秒為單位獲取差異:
dateutils.ddiff -i '%Y%m%d%H%M%S' 20200817040001 20210817040101
輸出:
31536060s
下一步:只需除以 86400 即可獲得天數或類似的小時數和分鐘數 :)
uj5u.com熱心網友回復:
出于性能原因,我們希望限制需要呼叫的子流程呼叫的數量:
- 使用
bash子字串功能將輸入轉換為可用的日期/時間字串 - 用
bash數學代替bc電話
bash將輸入分解為可用的日期/時間格式的子字串功能,例如:
# convert to usable date/time format:
$ start_date=1996010100
$ echo "${start_date:0:4}-${start_date:4:2}-${start_date:6:2} ${start_date:8:2}:00:00"
1996-01-01 00:00:00
# convert to epoch/seconds:
$ start=$(date -d "${start_date:0:4}-${start_date:4:2}-${start_date:6:2} ${start_date:8:2}:00:00" "%s")
$ echo $start
820476000
應用${end_date}和使用bash數學:
$ end_date=1996010122
$ end=$(date -d "${end_date:0:4}-${end_date:4:2}-${end_date:6:2} ${end_date:8:2}:00:00" "%s")
$ echo $end
820555200
$ hours=$(( (end - start) / 3600))
$ echo $hours
22
這給我們留下了 2 個子流程呼叫 ( $(date ...))。雖然其他語言/工具(awk,perl等)可能會加快一點速度,但如果您需要將結果存盤在bash變數中,那么您正在考慮需要至少 1 個子流程呼叫(即hours=$(awk/perl/??? ...))。
如果性能真的很重要(例如,需要執行這 1000 次),請查看使用 fifo、后臺行程和 io 重定向的這個 SO 答案date......是的,更多的編碼和更復雜的但也是對于大量操作來說要快一點。
uj5u.com熱心網友回復:
busybox date可以解決問題
start_date=1996010100
end_date=1996010122
START=$(busybox date -D "%Y%m%d%H" -d "$start_date" "%s")
END=$(busybox date -D "%Y%m%d%H" -d "$end_date" "%s")
HOURS=$(bc -l <<< "scale=0;($END - $START) / 3600")
echo $HOURS
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/456807.html
