最可靠的是直接用数值比较时间戳。Linux时间戳为自1970-01-01 UTC起的秒数整型,支持天然大小判断;脚本中可用(( ))对纯数字变量整数比较;字符串时间需用date -d转换并注意时区;日志筛选推荐awk按数值字段高效过滤。

直接用数值比较最可靠。Linux 时间戳本质是整数,表示从 1970-01-01 00:00:00 UTC 起经过的秒数,天然支持大小判断。
用 shell 变量和算术判断
适用于脚本中已知起止时间戳变量的情况:
- 确保变量是纯数字(不含空格、字母、单位)
- 使用
(( ))进行整数比较,简洁安全 - 示例:
start_ts=1726380000 # 2024-09-15 02:00:00 UTC end_ts=1726401600 # 2024-09-15 08:00:00 UTC now_ts=$(date +%s) <p>if (( now_ts >= start_ts && now_ts <= end_ts )); then echo "当前在区间内" else echo "当前不在区间内" fi
用 date 命令配合字符串时间做动态判断
当起止时间以“可读格式”给出(如 "2024-09-15 02:00"),需先转为时间戳再比:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 用
date -d "..." +%s转换,注意时区一致性 - 建议显式指定时区避免歧义,例如:
date -d "2024-09-15 02:00:00 UTC" +%s - 示例:
start_str="2024-09-15 02:00:00" end_str="2024-09-15 08:00:00" <p>start_ts=$(date -d "$start_str" +%s 2>/dev/null) end_ts=$(date -d "$end_str" +%s 2>/dev/null) now_ts=$(date +%s)</p><p>if [[ -n "$start_ts" && -n "$end_ts" ]] && (( now_ts >= start_ts && now_ts <= end_ts )); then echo "命中时间段" fi
在日志或文本中筛选时间戳区间
处理含时间戳字段的文件(如每行第一个字段是秒级时间戳):
- 用
awk直接按数值过滤,高效且无需额外转换 - 示例:筛选
access.log中时间戳在 1726380000 到 1726401600 之间的行awk '$1 >= 1726380000 && $1 <= 1726401600' access.log
- 若时间戳在其他列(如第 3 列),改用
$3;若为毫秒级,注意除以 1000 再比较
跨天或绕日场景要额外注意
如果时间段跨越 0 点(比如 “22:00–06:00”),不能简单用单区间逻辑:
- 先统一转成当日 00:00 起的秒偏移量(即
hour*3600 + min*60 + sec) - 再按“起始 ≤ 结束”或“起始 > 结束”两种逻辑分支判断
- 例如判断当前时间是否在 22:00 到次日 06:00 之间:
now_sec=$(( $(date +%H) * 3600 + $(date +%M) * 60 + $(date +%S) )) start_sec=$((22 * 3600)) end_sec=$((6 * 3600)) <p>if (( start_sec > end_sec )); then if (( now_sec >= start_sec || now_sec <= end_sec )); then echo "属于夜间区间" fi else if (( now_sec >= start_sec && now_sec <= end_sec )); then echo "属于日间区间" fi fi

















