取整到分钟(去掉秒)
场景:将当前时间精确到分钟(如 2025-10-05 14:30:00
→ 2025-10-05 14:30
)
方法:
date -d "@$(( $(date +%s) / 60 * 60 ))" "+%Y-%m-%d %H:%M"
原理:
date +%s
获取当前时间戳(秒级)。(时间戳 / 60)
对秒数整除60,得到分钟级整数。* 60
将分钟转换回秒级时间戳。date -d "@时间戳"
将新时间戳转为可读格式。
取整到小时(去掉分钟和秒)
场景:将时间对齐到整点(如 14:30:25
→ 14:00:00
)
方法:
date -d "@$(( $(date +%s) / 3600 * 3600 ))" "+%Y-%m-%d %H:%M:%S"
原理:
3600
表示1小时的秒数(60×60)。时间戳 / 3600
对秒数整除3600,得到小时级整数。* 3600
将小时转换回时间戳。
取整到天(去掉时间部分)
场景:仅保留日期(如 2025-10-05 14:30:00
→ 2025-10-05
)
方法:
date -d "@$(( $(date +%s) / 86400 * 86400 ))" "+%Y-%m-%d"
原理:
86400
是1天的秒数(24×3600)。- 时间戳整除86400后取整,再乘以86400得到当日0点的时间戳。
向上取整(如到下一整点)
场景:当前为 14:30
,取整到 15:00
方法:
date -d "@$(( (($(date +%s) + 3599) / 3600 * 3600 ))" "+%H:%M"
原理:
+ 3599
添加偏移量(避免整除时向下取整)。- 整除3600后,时间戳会跳到下一个整点。
复杂取整(结合 awk
或 bc
)
场景:自定义取整单位(如10分钟间隔)
示例(每10分钟取整):
timestamp=$(date +%s) rounded=$(( (timestamp / 600) * 600 )) # 600秒=10分钟 date -d "@$rounded" "+%Y-%m-%d %H:%M"
注意事项
- 时区问题:
以上命令均依赖系统时区,可用-u
参数指定UTC时间(如date -u
)。 - 跨时区脚本:
使用TZ
变量临时调整时区(如TZ='Asia/Shanghai' date
)。 - 兼容性:
date -d
在GNU/Linux中有效,若使用BSD系统(如macOS),需安装coreutils
或改用gdate
。
Linux时间取整的核心是时间戳的数学运算(整除、乘法),结合 date
命令的格式输出,通过调整除数(如60、3600、86400)可灵活适配分钟、小时、天等需求,对于复杂场景,建议先调试时间戳运算逻辑,再转换为可读格式。
引用说明:
- GNU Coreutils官方文档:Date Command
- Unix时间戳原理:Epoch Converter
- Shell算术运算参考:Bash Hackers Wiki
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5584.html