跳转至

使用 Luxon 处理日期和时间#

Luxon 是一个 JavaScript 库,可以更轻松地处理日期和时间。有关如何使用 Luxon 的完整详细信息,请参阅 Luxon 文档

n8n 在节点之间以字符串形式传递日期,因此您需要解析它们。Luxon 使这变得更容易。

Python 支持

Luxon 是一个 JavaScript 库。在代码节点中使用 Python 时,n8n 创建的两个便利变量是可用的,但它们的功能有限:

  • 您无法对这些变量执行 Luxon 操作。例如,没有与 $today.minus(...) 等效的 Python 方法。
  • 通用的 Luxon 功能,如将日期字符串转换为 Luxon,对 Python 用户不可用。

n8n 中的日期和时间行为#

请注意以下几点:

  • 在工作流中,n8n 在节点之间将日期和时间转换为字符串。在对来自其他节点的日期和时间进行算术运算时,请记住这一点。
  • 使用原生 JavaScript,您可以使用 new Date('2019-06-23') 将字符串转换为日期。在 Luxon 中,您必须使用明确声明格式的函数,例如 DateTime.fromISO('2019-06-23')DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")

在 n8n 中设置时区#

Luxon 使用 n8n 时区。此值可以是:

  • 默认值:America/New York
  • 您的 n8n 实例的自定义时区,使用 GENERIC_TIMEZONE 环境变量设置。
  • 个别工作流的自定义时区,在工作流设置中配置。

常见任务#

本节提供了一些常见操作的示例。更多示例和详细指导可在 Luxon 官方文档中找到。

获取当前日期时间或日期#

使用 $now$today Luxon 对象获取当前时间或日期:

  • now:包含当前时间戳的 Luxon 对象。等效于 DateTime.now()
  • today:包含当前时间戳的 Luxon 对象,向下舍入到天。等效于 DateTime.now().set({ hour: 0, minute: 0, second: 0, millisecond: 0 })

请注意,这些变量在转换为字符串时可能返回不同的时间格式:

1
2
3
4
5
6
{{$now}}
// n8n displays the ISO formatted timestamp
// For example 2022-03-09T14:02:37.065+00:00
{{"Today's date is " + $now}}
// n8n displays "Today's date is <unix timestamp>"
// For example "Today's date is 1646834498755"
1
2
3
4
5
6
$now
// n8n displays <ISO formatted timestamp>
// For example 2022-03-09T14:00:25.058+00:00
let rightNow = "Today's date is " + $now
// n8n displays "Today's date is <unix timestamp>"
// For example "Today's date is 1646834498755"
1
2
3
4
5
6
_now
# n8n displays <ISO formatted timestamp>
# For example 2022-03-09T14:00:25.058+00:00
rightNow = "Today's date is " + str(_now)
# n8n displays "Today's date is <unix timestamp>"
# For example "Today's date is 1646834498755"

n8n 提供内置的便利函数来支持表达式中日期的数据转换。有关更多信息,请参阅数据转换函数 | 日期

将 JavaScript 日期转换为 Luxon#

要将原生 JavaScript 日期转换为 Luxon 日期:

  • 在表达式中,使用 .toDateTime() 方法。例如,{{ (new Date()).ToDateTime() }}
  • 在代码节点中,使用 DateTime.fromJSDate()。例如,let luxondate = DateTime.fromJSDate(new Date())

将日期字符串转换为 Luxon#

您可以将日期字符串和其他日期格式转换为 Luxon DateTime 对象。您可以从标准格式和任意字符串进行转换。

Luxon DateTime 和 JavaScript Date 的区别

使用原生 JavaScript,您可以使用 new Date('2019-06-23') 将字符串转换为日期。在 Luxon 中,您必须使用明确声明格式的函数,例如 DateTime.fromISO('2019-06-23')DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")

如果您有支持的标准技术格式的日期:#

大多数日期使用 fromISO()。这从 ISO 8601 字符串创建一个 Luxon DateTime。例如:

1
{{DateTime.fromISO('2019-06-23T00:00:00.00')}}
1
let luxonDateTime = DateTime.fromISO('2019-06-23T00:00:00.00')

Luxon 的 API 文档中有关于 fromISO 的更多信息。

Luxon 提供了处理各种格式转换的函数。有关详细信息,请参阅 Luxon 的解析技术格式指南。

如果您有一个不使用标准格式的日期字符串:#

使用 Luxon 的自定义解析。为此,使用 fromFormat() 函数,提供字符串和一组描述格式的令牌

例如,您有 n8n 的成立日期,2019 年 6 月 23 日,格式为 23-06-2019。您希望将其转换为 Luxon 对象:

1
{{DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")}}
1
let newFormat = DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")

在使用自定义解析时,请注意 Luxon 关于限制的警告。如果您看到意外的结果,请尝试他们的调试指南。

获取从今天算起的 n 天#

获取今天之前或之后的天数。

例如,您希望设置一个字段始终显示当前日期之前七天的日期。

在表达式编辑器中,输入:

1
{{$today.minus({days: 7})}}

在 2019 年 6 月 23 日,这返回 [Object: "2019-06-16T00:00:00.000+00:00"]

此示例使用 n8n 的自定义变量 $today 以方便使用。它等效于 DateTime.now().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).minus({days: 7})

例如,您希望一个包含当前日期之前七天日期的变量。

在代码编辑器中,输入:

1
let sevenDaysAgo = $today.minus({days: 7})

在 2019 年 6 月 23 日,这返回 [Object: "2019-06-16T00:00:00.000+00:00"]

此示例使用 n8n 的自定义变量 $today 以方便使用。它等效于 DateTime.now().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).minus({days: 7})

有关更详细的信息和示例,请参阅:

创建人类可读的日期#

获取从今天算起的 n 天中,示例获取了当前日期之前七天的日期,并以 [Object: "yyyy-mm-dd-T00:00:00.000+00:00"](对于表达式)或 yyyy-mm-dd-T00:00:00.000+00:00(在代码节点中)的形式返回。为了使其更易读,您可以使用 Luxon 的格式化函数。

例如,您希望包含日期的字段格式为 DD/MM/YYYY,以便在 2019 年 6 月 23 日返回 23/06/2019

此表达式获取今天之前七天的日期,并将其转换为 DD/MM/YYYY 格式。

1
{{$today.minus({days: 7}).toLocaleString()}}
1
let readableSevenDaysAgo = $today.minus({days: 7}).toLocaleString()

您可以更改格式。例如:

1
{{$today.minus({days: 7}).toLocaleString({month: 'long', day: 'numeric', year: 'numeric'})}}

在 2019 年 6 月 23 日,这返回 "16 June 2019"。

1
let readableSevenDaysAgo = $today.minus({days: 7}).toLocaleString({month: 'long', day: 'numeric', year: 'numeric'})

在 2019 年 6 月 23 日,这返回 "16 June 2019"。

有关更多信息,请参阅 Luxon 关于 toLocaleString(人类可读字符串)的指南。

获取两个日期之间的时间#

要获取两个日期之间的时间,请使用 Luxon 的 diffs 功能。这会从一个日期中减去另一个日期并返回持续时间。

例如,获取两个日期之间的月数:

1
{{DateTime.fromISO('2019-06-23').diff(DateTime.fromISO('2019-05-23'), 'months').toObject()}}

这返回 [Object: {"months":1}]

1
let monthsBetweenDates = DateTime.fromISO('2019-06-23').diff(DateTime.fromISO('2019-05-23'), 'months').toObject()

这返回 {"months":1}

有关更多信息,请参阅 Luxon 的 Diffs

一个更长的示例:距离圣诞节还有多少天?#

此示例结合了几个 Luxon 功能,使用 JMESPath,并进行一些基本的字符串操作。

场景:您希望对 12 月 25 日进行倒计时。每天,它应该告诉您距离圣诞节还有多少天。您不希望为明年更新它 - 它需要在每年都无缝工作。

1
{{"There are " + $today.diff(DateTime.fromISO($today.year + '-12-25'), 'days').toObject().days.toString().substring(1) + " days to Christmas!"}}

这输出 "距离圣诞节还有 <天数> 天!"。例如,在 3 月 9 日,它输出 "距离圣诞节还有 291 天!"。

表达式作用的详细解释:

  • {{:表示表达式的开始。
  • "距离圣诞节还有 ":一个字符串。
  • +:用于连接两个字符串。
  • $today.diff():这与获取两个日期之间的时间中的示例类似,但它使用 n8n 的自定义 $today 变量。
  • DateTime.fromISO($today.year + '-12-25'), 'days':这部分使用 $today.year 获取当前年份,将其与月份和日期一起转换为 ISO 字符串,然后获取整个 ISO 字符串并将其转换为 Luxon DateTime 数据结构。它还告诉 Luxon 您希望持续时间以天为单位。
  • toObject() 将 diff() 的结果转换为更可用的对象。在此时,表达式返回 [Object: {"days":-<天数>}]。例如,在 3 月 9 日,[Object: {"days":-291}]
  • .days 使用 JMESPath 语法从对象中检索天数。有关在 n8n 中使用 JMESPath 的更多信息,请参阅我们的 JMESpath 文档。这给您距离圣诞节的天数,作为负数。
  • .toString().substring(1) 将数字转换为字符串并删除 -
  • + " 天!":另一个字符串,使用 + 将其与前一个字符串连接。
  • }}:表示表达式的结束。
1
let daysToChristmas = "There are " + $today.diff(DateTime.fromISO($today.year + '-12-25'), 'days').toObject().days.toString().substring(1) + " days to Christmas!";

这输出 "距离圣诞节还有 <天数> 天!"。例如,在 3 月 9 日,它输出 "距离圣诞节还有 291 天!"。

代码作用的详细解释:

  • "距离圣诞节还有 ":一个字符串。
  • +:用于连接两个字符串。
  • $today.diff():这与获取两个日期之间的时间中的示例类似,但它使用 n8n 的自定义 $today 变量。
  • DateTime.fromISO($today.year + '-12-25'), 'days':这部分使用 $today.year 获取当前年份,将其与月份和日期一起转换为 ISO 字符串,然后获取整个 ISO 字符串并将其转换为 Luxon DateTime 数据结构。它还告诉 Luxon 您希望持续时间以天为单位。
  • toObject() 将 diff() 的结果转换为更可用的对象。在此时,表达式返回 [Object: {"days":-<天数>}]。例如,在 3 月 9 日,[Object: {"days":-291}]
  • .days 使用 JMESPath 语法从对象中检索天数。有关在 n8n 中使用 JMESPath 的更多信息,请参阅我们的 JMESpath 文档。这给您距离圣诞节的天数,作为负数。
  • .toString().substring(1) 将数字转换为字符串并删除 -
  • + " 天!":另一个字符串,使用 + 将其与前一个字符串连接。
此页面是否
💬 微信

🚀 与作者交流

关注公众号
n8n实战笔记公众号
n8n实战笔记
📚 教程 💡 案例 🔧 技巧
添加微信
添加作者微信
1对1 专业指导
⚡ 快答 🎯 定制 🚀 支持