最可靠方案是用 insert_snippet 命令配合 $CURRENT_YEAR 等内置变量生成 ISO 时间;无需插件、兼容所有版本,输出格式为 2025-05-22T14

:36:08,自动补零且稳定高效。

insert_snippet 命令配合内置变量最可靠

Sublime Text 本身不提供一键插入 ISO 时间的快捷键,但可通过 insert_snippet 命令调用 $CURRENT_YEAR$CURRENT_MONTH 等内置时间变量拼出标准 ISO 格式(如 2025-05-22T14:36:08)。这是唯一无需插件、兼容所有版本(包括 Sublime Text 4)的原生方案。

操作步骤:

  • 打开命令面板(Ctrl+Shift+P / Cmd+Shift+P),输入 Preferences: Key Bindings 编辑用户快捷键文件
  • 添加如下键绑定(例如绑定到 Ctrl+Alt+T):
[
    {
        "keys": ["ctrl+alt+t"],
        "command": "insert_snippet",
        "args": {
            "contents": "${year}-${month}-${day}T${hour}:${minute}:${second}"
        }
    }
]

注意:${year} 等是 Sublime 的 snippet 变量语法,不是 Python 或 JS 表达式;它会自动补零(如 05 月、09 时),符合 ISO 8601 要求。

为什么不用 time.time() 或插件?

有人尝试用 Python 插件调用 datetime.now().isoformat(),但存在三个硬伤:

  • Sublime 的 Python API 不支持毫秒级精度的 isoformat(),默认输出带微秒(如 2025-05-22T14:36:08.123456),不符合多数日志系统对 ISO 标准的简化要求
  • 插件需额外安装、维护,且在 Sublime Text 4 中部分老插件已失效
  • time.time() 返回的是 Unix 时间戳,不是可读字符串,还得手动格式化,反而更麻烦

原生 snippet 变量由编辑器底层实时解析,启动快、无依赖、输出稳定 —— 日志场景下,确定性比灵活性更重要。

如果需要带时区(如 Z+08:00)怎么办?

Sublime 内置变量不提供时区偏移,${year}-${month}-${day}T${hour}:${minute}:${second} 默认是本地时间,不含时区标识。若必须带 Z(UTC):

  • 可手动追加 Z:把 snippet 改成 "contents": "${year}-${month}-${day}T${hour}:${minute}:${second}Z"
  • 但注意:这仅是“字面写 Z”,不代表你真的转换了时间 —— 如果本地不是 UTC,结果逻辑错误
  • 真要 UTC 时间,得写插件(用 datetime.utcnow().strftime(...)),但会回到上一节说的兼容性和精度问题

大多数内部日志、配置注释其实不需要严格 UTC,本地 ISO 时间已足够清晰可排序。

别忽略光标位置和多行粘贴行为

使用 snippet 插入后,光标默认停在 second 后面。如果想插入后立刻继续打字(比如写日志内容),可以加 $0 占位符:

"contents": "${year}-${month}-${day}T${hour}:${minute}:${second}$0"

另外,如果当前有选中文本,insert_snippet 会替换选区;如果没选中,则在光标处插入。这点在批量给多行日志加时间戳时很关键 —— 先用列选择(Ctrl+Alt+↑/↓)选中多行开头,再触发快捷键,就能一次插多行时间。

ISO 时间字符串里没有空格或特殊符号,所以几乎不会和现有语法冲突,放心用于 Markdown 注释、JSON 字段值、Shell 脚本变量赋值等场景。