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

如何在Shell中实现按毫秒递增遍历时分秒毫秒格式的指定时长

实现逐毫秒迭代输出HH:MM:SS.ms格式时间的方案

核心思路

直接对时、分、秒、毫秒各维度单独写进位处理逻辑繁琐易出错,统一把起始时间转成总毫秒数做递增运算,再反向换算格式化输出即可,实现逻辑简单且兼容性强。

具体实现代码(Bash环境)

#!/bin/bash
# 输入的起始时长参数
DURATION=00:14:17.82

# 1. 解析起始时间的时、分、秒、毫秒字段
IFS=':' read -r hh mm ss_ms <<< "$DURATION"
IFS='.' read -r ss ms <<< "$ss_ms"

# 2. 换算为总毫秒数(当前按2位毫秒处理,若需3位毫秒把所有100相关系数改为1000即可)
# 前缀10#是为了避免08、09这类带前导零的数字被系统识别为八进制报错
total_ms=$((10#$hh * 3600 * 100 + 10#$mm * 60 * 100 + 10#$ss * 100 + 10#$ms))

# 3. 循环迭代,可自定义结束条件
# 示例限定循环总时长为10分钟:end_ms=$((total_ms + 10*60*100)),把while条件改为((total_ms < end_ms))即可
while true; do
    # 反向把总毫秒数换算回时分秒毫秒
    current_ms=$((total_ms % 100))
    remain_sec=$((total_ms / 100))
    current_ss=$((remain_sec % 60))
    remain_min=$((remain_sec / 60))
    current_mm=$((remain_min % 60))
    current_hh=$((remain_min / 60))
    
    # 格式化输出,自动补前导零
    printf "%02d:%02d:%02d.%02d\n" "$current_hh" "$current_mm" "$current_ss" "$current_ms"
    
    # 逐毫秒递增
    total_ms=$((total_ms + 1))
    
    # 可选:加延时模拟真实时间流逝,sleep 0.001为每1ms输出一次,不加则全速输出
    # sleep 0.001
done

适配调整说明

  • 若需要3位毫秒格式,把代码里所有取模、除法、换算用到的100都改成1000,输出格式化的%02d(毫秒部分)对应改成%03d即可
  • 不需要无限循环的话,提前计算终止总毫秒数,给while加上终止条件即可匹配你原示例的for循环需求

内容的提问来源于stack exchange,提问作者Ruan Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:54:03