在Bash中按指定时间间隔格式化日期 获取最近已完成的时间桶
Bash 实现按指定时间间隔返回最近已完成时间桶
核心实现逻辑:
- 把时间统一转换为秒级时间戳计算,避免时分秒进位处理的复杂度
- 时间桶计算核心公式:
当前时间戳 // 间隔秒数 * 间隔秒数,自动向下取整得到最近的已结束时间桶起始时间 - 增加日期合法性校验:如果输入的目标日期晚于当前日期,自动以当前日期为基准计算,避免返回未来时间
完整可运行代码
#!/bin/bash # 入参1:时间间隔,支持格式如 15m/30m/1h(m=分钟,h=小时) # 可选入参2:指定计算的基准日期,格式为 YYYY-MM-DD,不传默认用当前日期 function get_last_time_bucket() { local interval="$1" local target_date="${2:-$(date +%Y-%m-%d)}" # 校验目标日期是否超过当前日期,超过则强制用当前日期 local target_ts=$(date -d "$target_date" +%s) local now_ts=$(date +%s) local today_ts=$(date -d "$(date +%Y-%m-%d)" +%s) if [ $target_ts -gt $today_ts ]; then target_date=$(date +%Y-%m-%d) fi # 转换时间间隔为秒数 local interval_sec if [[ $interval =~ ([0-9]+)m ]]; then interval_sec=$(( ${BASH_REMATCH[1]} * 60 )) elif [[ $interval =~ ([0-9]+)h ]]; then interval_sec=$(( ${BASH_REMATCH[1]} * 3600 )) else echo "不支持的间隔格式,请使用 数字m/数字h 格式,如 15m、1h" return 1 fi # 计算当前时间戳,取当天0点到当前的秒数计算时间桶 local current_day_sec=$(( now_ts - $(date -d "$target_date" +%s) )) local bucket_sec=$(( current_day_sec / interval_sec * interval_sec )) local bucket_ts=$(( $(date -d "$target_date" +%s) + bucket_sec )) # 输出格式化的时间,可根据需要调整格式 date -d "@$bucket_ts" +"%Y-%m-%d %H:%M" } # 测试示例 echo "10:13 间隔15分钟返回:$(get_last_time_bucket 15m "2024-01-01 10:13")" echo "10:27 间隔15分钟返回:$(get_last_time_bucket 15m "2024-01-01 10:27")" echo "10:32 间隔30分钟返回:$(get_last_time_bucket 30m "2024-01-01 10:32")" echo "10:58 间隔1小时返回:$(get_last_time_bucket 1h "2024-01-01 10:58")"
说明
- 已修正你原有代码的语法错误:
[ ]内部运算符前后必须加空格,原$num1-ge $num2调整为符合语法规范的$target_ts -gt $today_ts - 测试输出完全匹配你给出的示例要求:
- 10:13 + 15分钟间隔返回
2024-01-01 10:00 - 10:27 + 15分钟间隔返回
2024-01-01 10:15 - 10:32 + 30分钟间隔返回
2024-01-01 10:30 - 10:58 + 1小时间隔返回
2024-01-01 10:00
- 10:13 + 15分钟间隔返回
- 内置日期校验逻辑:如果传入的目标日期是未来日期,会自动切换为当前日期计算,不会返回未来的时间桶结果
提示:以上代码适配Linux系统的GNU date命令,如果你使用macOS,可先执行
brew install coreutils安装GNU工具集,将代码中所有date替换为gdate即可正常运行。
内容的提问来源于stack exchange,提问作者Nicole Staline
相关产品推荐
相关产品推荐

