所有時間運算(加減、差值)的本質是:日期時間 → 時間戳 → 秒數運算 → 轉回目標格式。
需求:在 1990-01-01 01:01:01 基礎上增加 1 小時 20 分鐘
# 1. 基礎時間轉時間戳
time1=$(date +%s -d '1990-01-01 01:01:01')
echo $time1 # 631126861
# 2. 增量轉換為秒
time2=$((1*60*60 + 20*60)) # 4800 秒
# 3. 相加並轉回可讀格式
time1=$((time1 + time2))
result=$(date +%Y-%m-%d\ %H:%M:%S -d "1970-01-01 UTC $time1 seconds")
echo $result # 1990-01-01 02:21:01
需求:2010-01-01 與 2009-01-01 11:11:11 的差值
# 獲取差值總秒數
diff=$(( $(date +%s -d '2010-01-01') - $(date +%s -d '2009-01-01 11:11:11') ))
# 拆解天/時/分/秒
days=$((diff / 86400))
hours=$(( (diff % 86400) / 3600 ))
minutes=$(( (diff % 3600) / 60 ))
seconds=$((diff % 60))
echo "${days}天 ${hours}時 ${minutes}分 ${seconds}秒"
| 語法 | 說明 | 示例 |
|---|---|---|
$(cmd) | 命令替換(推薦,可嵌套) | a=$(date) |
`cmd` | 命令替換(舊式,難嵌套) | a=`date` |
$((exp)) | 算術擴展(整數運算) | a=$((1+2)) |
date +%s -d 'STR' | 字符串轉時間戳 | date +%s -d '2023-01-01' |
date -d @TS | 時間戳轉日期 | date -d @1672531200 |
date -d '1970-01-01 UTC N seconds' | 標準轉換格式(跨平台兼容) | 見上文示例 |
date -d '2 days ago'、date -d 'next monday'date '+%Y%m%d_%H%M%S' 適合日誌文件命名date +%s%3N(需 GNU date 支持)TZ=UTC 或使用 date -u 避免時區干擾date -d 支持的字符串格式因版本而異,生產環境建議統一用 YYYY-MM-DD HH:MM:SS