日期时间看起来简单,真正写脚本时却很容易卡住:今天加 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 转成人容易看的格式。

给日期加减天数

给时间加减,可以用 EnvAddEnvSub。下面是当前时间加 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/3131 May 2026May 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
  • 日期计算:用 EnvAddEnvSub
  • 用户输入:先限制格式,再逐步兼容更多格式。

日期时间处理不难,难的是格式不统一。脚本越重要,越要早一点统一内部格式。只要内部格式稳,后面的显示、计算、保存都会轻松很多。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。