3 回答

TA貢獻1796條經驗 獲得超7個贊
如果您有GNU date
,它允許打印任意日期的表示形式(-d
選項)。在這種情況下,將日期轉換為自EPOCH以來的秒數,然后減去并除以24 * 3600。
還是您需要一種便攜式方式?

TA貢獻1824條經驗 獲得超5個贊
bash方式-將日期轉換為%y%m%d格式,然后可以從命令行直接執行以下操作:
echo $(( ($(date --date="031122" +%s) - $(date --date="021020" +%s) )/(60*60*24) ))

TA貢獻1829條經驗 獲得超6個贊
小心!這里的許多bash解決方案都打破了日期范圍,該日期范圍跨越了夏令時開始的日期(如果適用)。這是因為$((math))構造對結果值執行了“ floor” /截斷操作,僅返回整數。讓我說明一下:
DST于今年3月8日在美國開始,因此我們使用一個跨越以下日期范圍的日期:
start_ts=$(date -d "2015-03-05" '+%s')
end_ts=$(date -d "2015-03-11" '+%s')
讓我們看看使用雙括號可以得到什么:
echo $(( ( end_ts - start_ts )/(60*60*24) ))
返回“ 5”。
使用'bc'更精確地執行此操作會給我們帶來不同的結果:
echo "scale=2; ( $end_ts - $start_ts )/(60*60*24)" | bc
返回“ 5.95”-缺少的0.05是DST切換所損失的小時數。
那么應該如何正確完成呢?
我建議改用這個:
printf "%.0f" $(echo "scale=2; ( $end_ts - $start_ts )/(60*60*24)" | bc)
在這里,“ printf”舍入由“ bc”計算出的更準確的結果,從而為我們提供了正確的日期范圍“ 6”。
編輯:在下面@ hank-schultz的評論中突出顯示答案,我最近一直在使用它:
date_diff=$(( ($(date -d "2015-03-11 UTC" +%s) - $(date -d "2015-03-05 UTC" +%s) )/(60*60*24) ))
只要您總是從較晚的日期中減去較早的日期,這也應該是leap秒安全的,因為leap秒只會增加差異-截斷有效地舍入為正確的結果。
- 3 回答
- 0 關注
- 743 瀏覽
添加回答
舉報