在日常的服务器运维和脚本编写中,时间获取与处理是几乎每个站长和开发者都会遇到的基础操作,对于使用CentOS系统的用户而言,Shell是与之交互最频繁的工具,灵活地使用Shell命令获取和操作时间,能极大地提升工作效率和脚本的健壮性。

时间的基础:date命令
date命令是Shell中处理时间和日期的瑞士军刀,直接输入date,它会输出系统的当前时间,通常包括星期、月份、日期、时、分、秒和时区信息。
$ date 2023年 10月 27日 星期五 15:30:25 CST
这个默认格式虽然可读性好,但在脚本中却不便于解析。date命令提供了强大的格式化能力。
格式化输出:打造你需要的时间字符串
通过号接格式控制符,可以自定义输出内容,这在生成日志文件名、数据库备份标记等场景下至关重要。
- 获取年月日:
date +%Y-%m-%d会输出2023-10-27,这是一种国际通用的、不易出错的日期格式。 - 获取时分秒:
date +%H:%M:%S会输出15:30:25。 - 组合使用:
date "+%Y-%m-%d %H:%M:%S"会输出2023-10-27 15:30:25,注意,当格式字符串中包含空格时,最好用引号将其括起来。 - 时间戳:
date +%s会输出从1970年1月1日到现在的秒数,即Unix时间戳,这在计算时间间隔时非常方便。
常用格式符速查表:
| 格式符 | 含义 | 示例 |
|---|---|---|
%Y | 四位年份 | 2023 |
%y | 两位年份 | 23 |
%m | 月份 (01-12) | 10 |
%d | 日 (01-31) | 27 |
%H | 小时 (00-23) | 15 |
%M | 分钟 (00-59) | 30 |
%S | 秒 (00-60) | 25 |
%s | Unix时间戳 | 1698391825 |
%F | 完整的日期,等同 %Y-%m-%d | 2023-10-27 |
%T | 时间,等同 %H:%M:%S | 15:30:25 |
时间的计算:获取过去与未来的时间
date命令的另一个强大之处在于它能轻松地进行日期运算,这通过 -d 或 --date 参数实现。
- 获取明天的日期:
date -d "next day" +%F - 获取昨天的日期:
date -d "yesterday" +%F - 获取1小时前的时间:
date -d "1 hour ago" "+%F %T" - 获取3天后的日期:
date -d "3 days" +%F - 获取上周五的日期:
date -d "last fri" +%F
这些命令在需要定期清理日志、计算缓存过期时间或生成周期性报告的任务中非常实用。

实战应用场景
自动备份与日志记录
假设你需要每天凌晨备份网站数据,并要求备份文件包含日期信息。
#!/bin/bash # 定义备份目录和文件名 BACKUP_DIR="/home/backup" WEBSITE_DIR="/var/www/html" BACKUP_FILE="website_backup_$(date +%Y%m%d).tar.gz" # 执行备份 tar -czf "$BACKUP_DIR/$BACKUP_FILE" "$WEBSITE_DIR" # 记录日志 echo "[$(date "+%F %T")] 备份成功完成,文件:$BACKUP_FILE" >> /var/log/backup.log
这个脚本会生成类似 website_backup_20231027.tar.gz 的备份文件,并在日志中记录精确的操作时间。
监控与告警
在监控脚本中,我们经常需要计算某个进程的运行时长。
#!/bin/bash
PROCESS_NAME="nginx"
# 获取进程启动时间(基于进程PID和系统启动后的时钟滴答数,这里是一个简化示例)
# 实际生产环境请使用更严谨的 `ps -o lstart= -p PID` 方式获取
START_TIME=$(stat -c %Y /proc/$(pgrep $PROCESS_NAME | head -1))
CURRENT_TIME=$(date +%s)
RUNNING_TIME=$((CURRENT_TIME - START_TIME))
# 转换为天、时、分、秒
DAYS=$((RUNNING_TIME / 86400))
HOURS=$(( (RUNNING_TIME % 86400) / 3600 ))
echo "进程 $PROCESS_NAME 已运行 ${DAYS}天 ${HOURS}小时。" 定时任务中的灵活调度

Cron是Linux下常用的定时任务工具,但它的时间设定相对固定,结合Shell脚本和date命令,可以实现更灵活的调度。
你希望每个月的第一天执行一个任务,但Cron表达式 0 0 1 * * 可能会在1号凌晨执行,如果你希望任务在1号上午9点执行,并且如果1号是周末,就顺延到下一个周一,单纯靠Cron就很难实现,这时可以在脚本开头加入逻辑判断:
#!/bin/bash
TODAY=$(date +%u) # 获取今天是周几 (1-7, 1为周一)
DAY_OF_MONTH=$(date +%d) # 获取今天是几号
# 判断:如果是1号,且不是周六(6)或周日(7)
if [ "$DAY_OF_MONTH" -eq 01 ] && [ "$TODAY" -ne 6 ] && [ "$TODAY" -ne 7 ]; then
# 执行你的月度任务
/path/to/your/monthly_task.sh
fi 关于时区的注意事项
服务器部署在全球不同地区时,时区设置就变得非常重要,使用timedatectl命令可以查看和修改系统时区。
- 查看当前时区:
timedatectl status - 设置时区为上海:
timedatectl set-timezone Asia/Shanghai
确保服务器时区与你的目标业务时区一致,可以避免很多因时间差导致的数据混乱问题。
从简单的日期显示到复杂的定时任务逻辑,Shell对时间的操控能力是系统管理和自动化脚本的基石,掌握date命令及其相关技巧,意味着你能更从容地应对各种与时间相关的技术需求,对于站长而言,这份熟练度直接关系到网站维护的自动化水平和问题排查的效率,多动手实践,将这些命令融入到你的日常工作中,很快就能感受到它们带来的便利。
