You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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
  • 内置日期校验逻辑:如果传入的目标日期是未来日期,会自动切换为当前日期计算,不会返回未来的时间桶结果

提示:以上代码适配Linux系统的GNU date命令,如果你使用macOS,可先执行brew install coreutils安装GNU工具集,将代码中所有date替换为gdate即可正常运行。

内容的提问来源于stack exchange,提问作者Nicole Staline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 00:15:03