最稳方案是用 insert_snippet 命令绑定内置变量 ${year}-${month}-${day}T${hour}:${minute}:${second},跨平台、无依赖、自动补零、ST3/ST4 一致。

直接用 insert_snippet 命令 + 内置变量最稳,不装插件、不调系统命令、跨平台一致。 插件或 insert_date 命令看似省事,但容易因格式符错误、系统差异或热键冲突失效;而 ${year}-${month}-${day}T${hour}:${minute}:${second} 这类写法由 Sublime 底层实时解析,启动快、无依赖、输出确定。
用 insert_snippet 绑定快捷键插入 ISO 时间
这是日志/注释场景下最推荐的方案:格式标准、自动补零、ST3/ST4 行为完全一致。
- 打开
Preferences → Key Bindings,在右侧用户配置中添加:
[
{
"keys": ["ctrl+alt+t"],
"command": "insert_snippet",
"args": {
"contents": "${year}-${month}-${day}T${hour}:${minute}:${second}"
}
}
]
-
${year}等变量是 Sublime 原生支持的 snippet 变量,不是 Python 表达式,也不依赖date命令 —— Windows 用户不用改任何东西 - 输出为
2026-05-21T09:15:33,符合 ISO 8601,且月份、日期、小时等自动补零(不会出现2026-5-21T9:15:33) - 若需空格分隔而非
T,把contents改成"${year}-${month}-${day} ${hour}:${minute}:${second}"
写自定义 .sublime-snippet 文件并设 tabTrigger
适合高频插入、且希望用 Tab 触发(比如写日志时输入 log 再按 Tab)。
- 菜单栏
Tools → Developer → New Snippet…,替换内容为:
<snippet>
<content><![CDATA[${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE} ${CURRENT_HOUR}:${CURRENT_MINUTE}:${CURRENT_SECOND}]]></content>
<tabTrigger>dt</tabTrigger>
<scope>text.plain, source.log, text.html</scope>
</snippet>
-
${CURRENT_XXX}和${xxx}功能等价,但前者更易读;注意${CURRENT_MONTH}不补零(输出5),而${month}补零(输出05),优先用后者 -
<scope></scope>控制生效范围,比如只在.log或.md文件里响应dt+ Tab - 保存路径必须是
Packages/User/xxx.sublime-snippet,否则不加载
为什么别用 $(date +...) 或插件默认格式
看似方便,实则埋坑最多。
-
${1:$(date +%Y-%m-%d)}在 Windows 下必然失败 —— Sublime 调用的是 cmd/shell,而 Windows 原生命令不支持+格式符,结果光标处留空或报错 - InsertDate 插件虽开箱即用,但它的默认格式
%Y-%m-%d %H:%M:%S无法通过快捷键直接指定,必须进 Package Settings 修改,且改完要等插件重载 -
insert_date命令的format参数若含中文引号、全角空格或不支持的格式符(如%f微秒),会静默失败 —— 按下快捷键后光标不动,连错误提示都没有 - 所有基于系统
date命令或 Pythonstrftime的方案,都可能因时区设置、locale 配置或 Python 版本差异导致跨机器输出不一致
需要毫秒或时区标识?只能写插件
内置变量和 insert_date 都不支持毫秒(.123)或时区偏移(Z 或 +08:00)。
- 新建
Packages/User/insert_timestamp.py,内容精简为:
import sublime, sublime_plugin, datetime
class InsertTimestampCommand(sublime_plugin.TextCommand):
def run(self, edit):
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:23]
for region in self.view.sel():
self.view.replace(edit, region, now)
- 绑定快捷键:
{"keys": ["ctrl+shift+t"], "command": "insert_timestamp"} - 关键点:
strftime(...)[:23]截断微秒到毫秒位(.123),避免输出.123456;必须遍历self.view.sel(),否则多光标只处理第一个 - 不要用
time.time()—— 它返回 Unix 时间戳,不带时区信息,转成本地时间前还可能因系统未校准偏差 8 小时
真正麻烦的从来不是“怎么插入”,而是“插入后要不要改”——比如你刚按了快捷键,发现格式不对,又得删掉重来。用原生 snippet 变量,格式在绑定时就锁死了,每次输出都一样,省下的调试时间比写配置多得多。

















