还在靠肉眼看日期?n8n 自动化中的时间陷阱与破局之道
笔者在 N8N大学 混迹多年,见过太多“血案”。其中一种最隐蔽的坑,就是时间逻辑判断。你有没有遇到过这种情况:明明是 2023 年的数据,系统却认为它发生在 2024 年之后?或者两个日期放在一起,死活判断不出谁大谁小?

在自动化流程中,时间就是生命线。一旦逻辑判断出错,后续的发送邮件、更新数据库、触发提醒等动作就会全线崩溃。今天,笔者就带大家彻底搞定 n8n 中的日期比较,教你如何精准判断 Is After(在之后)和 Is Before(在之前),让你的自动化流程坚如磐石。
为什么你的日期比较总是出错?
在动手之前,我们得先搞清楚 n8n 的“脾气”。n8n 对日期的处理非常依赖底层的 JavaScript 标准,也就是 ISO 8601 格式(例如:2023-10-27T10:00:00Z)。
很多新手容易犯的错有两点:
- 格式混乱: 从 API 拿到的是
yyyy-mm-dd,从表单提交的是10/27/2023。n8n 看到这些字符串,如果不经过处理,根本无法进行数学层面的时间比较。 - 时区忽略: 每一个日期都应该有时区信息。如果你的服务器在美国,而用户在中国,不带时区的日期比较会导致 8 小时的误差,这足以让你的“当天”判断彻底失效。
核心工具:Switch 节点与 JS 节点的终极对决
在 n8n 中比较日期,我们主要有两把尖刀:Switch 节点和 Code 节点。前者适合直观的逻辑分流,后者适合处理复杂的脏数据。
方法一:使用 Switch 节点(直观派)
如果你的数据非常干净,都是标准的 ISO 格式,Switch 节点是最佳选择。
- 拖入一个 Switch 节点。
- 在 Value 中选择你要比较的字段,比如
{{ $('HTTP Request').json.date1 }}。 - 在 Rules 设置中,选择 Date 类别。这里你有 Is After 和 Is Before 两个选项。
- 输入对比值。注意,这里必须填入标准的日期字符串或引用。
笔者提醒: Switch 节点虽然方便,但它对格式极其敏感。如果你的数据是 "2023-10-27" 这种字符串,Switch 往往无法正确识别为日期对象,导致判断失败。
方法二:使用 Code 节点(硬核派,推荐)
这是 N8N大学 最推荐的方法,因为它能让你在比较前清洗数据。我们使用 JavaScript 的 Date 对象来强制转换。
- 在流程中插入一个 Code 节点。
- 将前一个节点的数据传入。
- 编写如下逻辑:
// 假设输入字段为 date1 和 date2
const date1 = new Date(items[0].json.date1);
const date2 = new Date(items[0].json.date2);
// 比较逻辑
let result = false;
if (date1 > date2) {
result = true; // date1 在 date2 之后 (Is After)
} else {
result = false;
}
// 输出结果供后续节点使用
return [{ json: { is_after: result, date1, date2 } }];
这段代码虽然简单,但它利用了 JS 强大的 Date 解析能力,能处理绝大多数格式的日期字符串,然后再进行毫秒级的精准比对。
实战场景:如何判断任务是否逾期?
假设我们有一个场景:系统收到一个任务,截止日期是 deadline,我们需要判断当前时间是否已经 Is After 截止日期。
这里有个大坑:当前时间怎么获取?
在 n8n 的 Code 节点中,你可以直接使用 new Date() 来获取服务器的当前时间。但请注意,如果你的 n8n 部署在 Docker 容器中,容器的时间可能与宿主机不同步,或者时区设置不一致。
最佳实践: 尽量使用 ISO 格式的 UTC 时间进行比较,避免使用本地时间。例如,获取当前时间使用 new Date().toISOString()。
避坑指南:时区与数据类型转换
在 N8N大学 的社群里,关于日期比较的报错,90% 都是时区问题。
坑点 1:字符串陷阱
如果你的输入是 "2023-10-27T00:00:00"(没有 Z 或时区偏移),JavaScript 会把它当作本地时间解析。如果你的 n8n 运行在 UTC 服务器,它就会比你预期的时间早 8 小时。这会导致 Is Before 判断错误,比如系统认为还没到时间,实际上已经过了。
坑点 2:格式统一
永远不要相信外部传入的数据。在比较之前,务必通过 Code 节点或 Function Item 节点将两个日期都转换为 Date 对象。不要试图直接用字符串比大小,"2023-01-01" > "2022-12-31" 这种字符串比较在某些情况下会出错。
FAQ 常见问题解答
Q1: n8n 的 Switch 节点里,Is After/Before 是基于什么时间基准?
Switch 节点中的日期比较是基于你输入的对比值。如果你输入的是具体日期字符串,它会尝试解析。如果你输入的是引用(如 {{ $json.date2 }}),它会将两个日期字符串都解析为 Date 对象进行毫秒数对比。
Q2: 如果我想比较“相差天数”而不是谁大谁小,该怎么做?
这需要使用 Code 节点。逻辑是:
const diffTime = Math.abs(new Date(date2) - new Date(date1));
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
这样就能得到具体的天数差,然后配合 Switch 节点判断是否大于 0 或特定天数。
Q3: 我的数据源是 Excel 导入的,日期格式乱码怎么办?
Excel 导入的日期在 n8n 中经常变成数字(如 44562)。这是因为 Excel 将日期存储为自 1900 年 1 月 1 日以来的天数。你需要使用 Code 节点:
const excelDate = new Date(Math.round((items[0].json.excel_date - 25569)*86400*1000));
(注意:这里涉及 Excel 的日期基准修正,建议先在 Excel 中转换为标准日期格式再导出)。
总结与资源
在 n8n 中处理时间逻辑,核心原则只有一条:先标准化,再比较。不要依赖 Switch 节点的自动猜测,Code 节点才是处理复杂时间逻辑的瑞士军刀。
掌握了日期比较,你的自动化流程就拥有了“时间感”,能真正实现智能化的调度与响应。如果你在实操中遇到了棘手的时区问题,欢迎来到 N8N大学 (n8ndx.com) 的社区交流,我们一起避坑。