日期时间看起来简单,真正写脚本时却很容易卡住:今天加 7 天怎么写?两个日期差多少天?用户输入的日期格式不统一怎么办?文件名里想带时间戳,又不想出现非法字符怎么办?
AHK v1 自带的日期时间能力其实够用。关键是先接受一个规则:脚本内部尽量用标准时间戳,显示给用户时再格式化。
标准时间戳是什么
AHK 常用的标准时间戳格式是 yyyyMMddHHmmss。比如 20260531143000 表示 2026 年 5 月 31 日 14 点 30 分。它的好处是容易比较、容易计算,也适合排序。
#Requires AutoHotkey v1.1 now := A_Now FormatTime, showTime, %now%, yyyy-MM-dd HH:mm:ss MsgBox, % "内部时间戳:" now "`n显示时间:" showTime
A_Now 是当前本地时间。脚本里做计算时用 A_Now 这种紧凑格式,界面里再用 FormatTime 转成人容易看的格式。
给日期加减天数
给时间加减,可以用 EnvAdd 和 EnvSub。下面是当前时间加 7 天。
target := A_Now EnvAdd, target, 7, Days FormatTime, text, %target%, yyyy-MM-dd MsgBox, % "7 天后是:" text
如果要减 3 天,可以加负数:
target := A_Now EnvAdd, target, -3, Days FormatTime, text, %target%, yyyy-MM-dd MsgBox, % "3 天前是:" text
单位除了 Days,还可以用秒、分、小时等。写定时、过期判断、日志文件名时,这类计算很常见。
计算两个日期相差多少天
两个时间戳相减时,推荐先复制一个变量,再用 EnvSub。
start := "20260501" end := "20260531" diff := end EnvSub, diff, %start%, Days MsgBox, % "相差 " diff " 天"
如果只写到年月日,AHK 会把缺少的时分秒按默认值处理。为了减少歧义,我更建议在重要脚本里补全成 yyyyMMdd000000 这种形式。
生成适合文件名的时间
很多脚本会把运行结果写成日志、截图、备份文件。文件名里不要直接使用冒号,因为 Windows 文件名不允许冒号。可以这样生成:
FormatTime, stamp,, yyyyMMdd_HHmmss file := A_ScriptDir "\log_" stamp ".txt" FileAppend, 脚本运行完成`n, %file%, UTF-8 MsgBox, %file%
这种时间戳文件名天然按时间排序,比“今天备份”“最新日志”这种名字稳得多。
从文本里提取日期
如果日期来自用户复制的文本,格式往往不统一。简单场景可以先支持一种格式,比如 2026-05-31。
text := "付款日期:2026-05-31,请在 7 天内处理。"
if RegExMatch(text, "(\d{4})-(\d{1,2})-(\d{1,2})", m)
{
date := Format("{:04}{:02}{:02}000000", m1, m2, m3)
FormatTime, show, %date%, yyyy年MM月dd日
MsgBox, %show%
}
如果要同时支持 2026/5/31、31 May 2026、May 31, 2026,正则会明显变复杂。我的建议是先确定你的用户最常见的两三种格式,不要一开始就想吃下所有日期写法。
提取两个日期并计算跨度
Jack 原文里有一篇专门讲从一段文字里提取两个日期,然后计算时间跨度。下面给一个简化版,只支持 yyyy-MM-dd,但思路很清楚。
text := "项目周期:2026-05-01 到 2026-05-31"
if RegExMatch(text, "(\d{4})-(\d{1,2})-(\d{1,2}).*?(\d{4})-(\d{1,2})-(\d{1,2})", m)
{
start := Format("{:04}{:02}{:02}000000", m1, m2, m3)
end := Format("{:04}{:02}{:02}000000", m4, m5, m6)
diff := end
EnvSub, diff, %start%, Days
MsgBox, % "相差 " diff " 天"
}
这里的重点是 .*?,它表示两个日期中间可以有任意文字,但尽量少匹配。实际使用时,日期格式越混乱,越应该把“提取日期”和“计算日期”拆成两个函数,不要全写在一个正则里。
我的写法习惯
- 内部保存:用
yyyyMMddHHmmss。 - 界面显示:用
FormatTime。 - 文件命名:用
yyyyMMdd_HHmmss。 - 日期计算:用
EnvAdd、EnvSub。 - 用户输入:先限制格式,再逐步兼容更多格式。
日期时间处理不难,难的是格式不统一。脚本越重要,越要早一点统一内部格式。只要内部格式稳,后面的显示、计算、保存都会轻松很多。

评论(0)