最近发现的工具,觉得不错,以下内容我基本验证过了,由ai最终生成,如有错误,请指正。

批处理中经常会遇到日期时间计算,例如:
* 获取几秒、几分钟或几小时后的时间
* 计算指定日期时间之前或之后的时间
* 处理跨天、跨月、跨年等情况
* 获取 Unix 时间戳
* 在普通日期时间与 Unix 时间戳之间转换
单纯使用 CMD 自带命令实现这些功能比较麻烦,而 UnxUtils 中的 date.exe 可以很方便地完成此类计算。
以下用法在 Windows 11 下使用 UnxUtils 版 date.exe 实际验证通过。

## 一、使用前说明
由于 UnxUtils 的 date.exe 与 Windows 自带的 date 命令同名,为避免冲突,建议先改名为:
然后将 gdate.exe 放在批处理文件所在目录,或者放进已加入 PATH 环境变量的目录。
本文示例均按照批处理文件中的语法书写,因此日期格式中的百分号使用双百分号:
- gdate "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
如果直接在 CMD 命令行窗口中执行,则需要把双百分号改成单百分号:
- gdate "+%Y-%m-%d %H:%M:%S"
复制代码

## 二、这个版本需要注意的语法
这个 UnxUtils 版本比较老,在进行相对时间计算时,推荐使用下面的规则。
计算未来时间时,数字前面不要写加号:
计算过去时间时,在表达式末尾加 ago:
不建议使用下面这样的写法:
经过实际测试,加号和减号在这个旧版本中可能被错误解析。
简单记忆就是:
- 3 hour 表示3小时后
- 3 hour ago 表示3小时前
复制代码

## 三、常用日期时间格式
- %%Y 四位年份,例如 2026
- %%y 两位年份,例如 26
- %%m 月份,例如 06
- %%d 日期,例如 21
- %%H 小时,24小时制,例如 08
- %%M 分钟,例如 00
- %%S 秒,例如 00
- %%j 一年中的第几天
- %%a 星期缩写
- %%A 星期全称
- %%s Unix 时间戳
- %%T 等价于 %%H:%%M:%%S
- %%D 等价于 %%m/%%d/%%y
复制代码
需要注意,这个版本不支持 %%F。
如果需要输出:
应直接写:
而 %%D 输出的是:

## 四、支持的时间单位
常用时间单位可以使用单数或复数形式:
- second / seconds
- minute / minutes
- hour / hours
- day / days
- week / weeks
- month / months
- year / years
复制代码
其中秒和分钟还支持简写:
- second / seconds
- sec / secs
- minute / minutes
- min / mins
复制代码
例如下面几种写法都可以表示30分钟后:
- gdate -d "30 minute" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
- gdate -d "30 minutes" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
- gdate -d "30 min" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
- gdate -d "30 mins" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码

## 五、按照当前日期时间计算
获取当前日期时间:
- gdate "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取当前日期:
获取当前时间:
也可以使用 %%T 简写:
获取3秒后的时间:
- gdate -d "3 second" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取3秒前的时间:
- gdate -d "3 second ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取30分钟后的时间:
- gdate -d "30 min" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取30分钟前的时间:
- gdate -d "30 min ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取3小时后的时间:
- gdate -d "3 hour" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取3小时前的时间:
- gdate -d "3 hour ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取1小时3秒后的时间:
- gdate -d "1 hour 3 second" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取1小时3秒前的时间:
- gdate -d "1 hour 3 second ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取7天后的日期:
- gdate -d "7 day" "+%%Y-%%m-%%d"
复制代码
获取7天前的日期:
- gdate -d "7 day ago" "+%%Y-%%m-%%d"
复制代码
获取2周后的日期:
- gdate -d "2 week" "+%%Y-%%m-%%d"
复制代码
获取2周前的日期:
- gdate -d "2 week ago" "+%%Y-%%m-%%d"
复制代码
获取1个月后的日期:
- gdate -d "1 month" "+%%Y-%%m-%%d"
复制代码
获取1个月前的日期:
- gdate -d "1 month ago" "+%%Y-%%m-%%d"
复制代码
获取1年后的日期:
- gdate -d "1 year" "+%%Y-%%m-%%d"
复制代码
获取1年前的日期:
- gdate -d "1 year ago" "+%%Y-%%m-%%d"
复制代码

## 六、按照指定日期时间计算
除了按照当前时间计算,还可以指定一个日期时间作为计算基准。
例如,以 2026-06-21 08:00:00 为基准,计算3秒后的时间:
- gdate -d "2026-06-21 08:00:00 3 second" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
计算3秒前的时间:
- gdate -d "2026-06-21 08:00:00 3 second ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
计算3小时后的时间:
- gdate -d "2026-06-21 08:00:00 3 hour" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
计算3小时前的时间:
- gdate -d "2026-06-21 08:00:00 3 hour ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
计算1小时3秒后的时间:
- gdate -d "2026-06-21 08:00:00 1 hour 3 second" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
计算1小时3秒前的时间:
- gdate -d "2026-06-21 08:00:00 1 hour 3 second ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
计算指定日期7天后的日期:
- gdate -d "2026-06-21 7 day" "+%%Y-%%m-%%d"
复制代码
计算指定日期1个月前的日期:
- gdate -d "2026-06-21 1 month ago" "+%%Y-%%m-%%d"
复制代码

## 七、快捷时间表达式
获取明天此时:
- gdate -d "tomorrow" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取昨天此时:
- gdate -d "yesterday" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取一周后:
- gdate -d "week" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取一周前:
- gdate -d "week ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取两周后:
- gdate -d "2 week" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取一个月后:
- gdate -d "month" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取一个月前:
- gdate -d "month ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取一年后:
- gdate -d "year" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
获取一年前:
- gdate -d "year ago" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码

## 八、获取 Unix 时间戳
获取当前时间的 Unix 时间戳:
获取3秒后的 Unix 时间戳:
获取3秒前的 Unix 时间戳:
- gdate -d "3 sec ago" "+%%s"
复制代码
获取3小时后的 Unix 时间戳:
获取3小时前的 Unix 时间戳:
- gdate -d "3 hour ago" "+%%s"
复制代码
将指定日期时间转换为 Unix 时间戳:
- gdate -d "2026-06-21 08:00:00" "+%%s"
复制代码
获取指定日期时间3秒后的 Unix 时间戳:
- gdate -d "2026-06-21 08:00:00 3 sec" "+%%s"
复制代码
获取指定日期时间3秒前的 Unix 时间戳:
- gdate -d "2026-06-21 08:00:00 3 sec ago" "+%%s"
复制代码

## 九、Unix 时间戳转换为普通时间
现代 GNU date 通常可以使用:
但这个 UnxUtils 旧版本不支持这种写法。
需要改成以 1970-01-01 UTC 为基准增加相应秒数:
- gdate -d "1970-01-01 UTC 1781991234 sec" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
也可以稍微简写:
- gdate -d "1970-1-1 Z 1781991234 sec" "+%%Y-%%m-%%d %%T"
复制代码
其中:
- UTC 和 Z 均表示协调世界时
- %%T 等价于 %%H:%%M:%%S
复制代码
计算这个 Unix 时间戳3秒后的普通时间:
- gdate -d "1970-1-1 Z 1781991234 sec 3 sec" "+%%Y-%%m-%%d %%T"
复制代码
计算这个 Unix 时间戳3秒前的普通时间:
- gdate -d "1970-1-1 Z 1781991234 sec 3 sec ago" "+%%Y-%%m-%%d %%T"
复制代码
计算这个 Unix 时间戳3小时后的普通时间:
- gdate -d "1970-1-1 Z 1781991234 sec 3 hour" "+%%Y-%%m-%%d %%T"
复制代码
计算这个 Unix 时间戳3小时前的普通时间:
- gdate -d "1970-1-1 Z 1781991234 sec 3 hour ago" "+%%Y-%%m-%%d %%T"
复制代码

## 十、总结
这个 UnxUtils 版 date.exe 虽然版本较老,不支持部分现代 GNU date 的语法,但对于批处理中的常规日期时间计算已经很实用。
使用时主要记住三点:
1. 为避免与系统命令重名,建议将 date.exe 改名为 gdate.exe。
2. 计算未来时间时,不写加号;计算过去时间时,在末尾加 ago。
3. Unix 时间戳转换不能使用 @时间戳,需要采用下面的形式:
例如:
- gdate -d "1970-01-01 UTC 1781991234 sec" "+%%Y-%%m-%%d %%H:%%M:%%S"
复制代码
以上示例均按照批处理文件语法书写,并在 Windows 11 下使用 UnxUtils 版 date.exe 实际验证。
|