我想將分鐘四舍五入到最接近的 15 分鐘間隔,即 00、15、30、45。我目前正在執行以下操作:
echo $(date '%Y/%m/%d/%H/')$((($(($(date '%M') / 15))-0)*15))
但是在 1-14 分鐘之間的一小時開始時,我得到“/2021/11/03/21/0”而不是 00。
另外,我不確定這是否是最好的方法。有沒有其他選擇?
uj5u.com熱心網友回復:
請您嘗試以下操作:
mod=$(( 10#$(date %M) % 15 ))
date -d "-${mod} minutes" %Y/%m/%d/%H/%M
- 該變數
mod保存分鐘數除以 15 的余數。 - 然后通過減去 向下舍入到最接近的 15 分鐘間隔
mod。
uj5u.com熱心網友回復:
另一種方法:
min=$(printf "%0.2d" $(( ($(date '%M') / 15) * 15 )))
echo "$(date '%Y/%m/%d/%H/')$min"
uj5u.com熱心網友回復:
date -d "@$((($(date %s) 450) / 900 * 900))"
這使用整數除法的屬性來“減去模數”并將所需間隔的一半添加到(幾乎)模擬舍入操作。
通過考慮%N(納秒)可以實作一些額外的亞秒舍入精度(沒有充分的理由)。但沒關系,因為舍入間隔的確切一半(450 秒)已經與默認的紀元解析度(1 秒)對齊。(如果所需舍入間隔中的秒數為奇數,則以下將增加時間舍入精度。)
date -d "@$((($(date %s%N) 45*10**10) / (9*10**11) * 900))"
uj5u.com熱心網友回復:
純 bash,bash 4.3 或更高版本:
printf '%(%Y/%m/%d/%H/%M)T\n' "$(( $(printf '%(%s)T') /(15*60)*(15*60) ))"
使用 GNU date(任何 bash 版本或 POSIX shell):
date -d @$(( $(date %s) /(15*60)*(15*60) )) %Y/%m/%d/%H/%M
- 將當前紀元日期(自 以來的秒數
1970-01-01 00:00:00)截斷為 15 分鐘(900 秒)間隔,然后轉換為所需格式。 - 僅檢索當前日期/時間一次。
- 如果您從兩個單獨的日期/時間構建日期/時間,則當一個單位在兩者之間打勾時,它可能是錯誤的。
- 將
printf在bash 4.2加入的日期時間格式字串,并在4.3,改為還列印出當前時間,如果沒有輸入日期給出。 - 需要注意的是來砸與零作為八進制開始算術對待號碼,相同的數字
08,并09會導致錯誤(因為它們不是八進制數)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/348061.html
上一篇:回傳每個日歷月的作業日數
下一篇:R日期格式在sapply后更改
