Skip to content

Luxon 的日期和时间

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

n8n 在节点之间传递日期时会使用字符串,因此您需要对其进行解析。Luxon 让解析过程更加简单。

Python 支持

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

  • 您无法对这些变量执行 Luxon 操作。例如,Python 中没有 的等效项。
  • 通用 Luxon 功能(例如将日期字符串转换为 Luxon )不适用于 Python 用户。

变量

n8n 使用 Luxon 提供两个自定义变量:

  • :包含当前时间戳的 Luxon 对象。等同于。
  • :一个 Luxon 对象,包含当前时间戳,向下舍入到天数。相当于。

请注意,这些变量转换为字符串时可以返回不同的时间格式。这与 Luxon 的行为相同。

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 提供内置便捷函数,支持日期表达式中的数据转换。更多信息,请参阅数据转换函数 | 日期

n8n 中的日期和时间行为

请注意以下事项:

  • 在工作流中,n8n 会在节点之间将日期和时间转换为字符串。在对其他节点的日期和时间进行运算时,请记住这一点。
  • 使用原生 JavaScript,您可以使用 将字符串转换为日期。在 Luxon 中,您必须使用明确说明格式的函数,例如或。

在 n8n 中设置时区

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

  • 默认:
  • 使用环境变量设置 n8n 实例的自定义时区。
  • 在工作流设置中配置的单个工作流的自定义时区。

常见任务

本节提供一些常见操作的示例。更多示例和详细指南请参阅Luxon 官方文档

将日期字符串转换为 Luxon

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

Luxon DateTime 和 JavaScript Date 之间的区别

使用原生 JavaScript,您可以使用 将字符串转换为日期。在 Luxon 中,您必须使用明确说明格式的函数,例如或。

如果您有一个采用受支持的标准技术格式的日期:

大多数日期使用。这将根据 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 的Ad-hoc 解析。为此,请使用函数,提供字符串和一组描述格式的标记

例如,您有 n8n 的成立日期,2019 年 6 月 23 日,格式为。您想将其转换为 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 日,这将回归。

为了方便起见,本例使用了 n8n 的自定义变量。它相当于。

例如,您需要一个包含当前日期前七天的日期的变量。

在代码编辑器中输入:

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

2019 年 6 月 23 日,这将回归。

为了方便起见,本例使用了 n8n 的自定义变量。它相当于。

更多详细信息和示例,请参阅:

创建人类可读的日期

“获取从今天起 n 天后的日期”中,示例获取当前日期前七天的日期,并将其作为(用于表达式)或(在代码节点中)返回。为了使其更具可读性,您可以使用 Luxon 的格式化函数。

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

此表达式获取今天七天前的日期,并将其转换为 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 日,返回“2019 年 6 月 16 日”。

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

2019 年 6 月 23 日,返回“2019 年 6 月 16 日”。

请参阅 Luxon 的toLocaleString(人类字符串)指南以了解更多信息。

获取两个日期之间的时间

要获取两个日期之间的时间,请使用 Luxon 的 diffs 功能。该功能会将一个日期与另一个日期相减,并返回一个时长。

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

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

这将返回。

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

这将返回。

请参阅 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 天!”。

该表达式的作用的详细解释:

  • : 表示表达式的开始。
  • :一个字符串。
  • :用于连接两个字符串。
  • :这与获取两个日期之间的时间中的示例类似,但它使用了 n8n 的自定义变量。
  • :此部分使用 获取当前年份,将其连同月份和日期一起转换为 ISO 字符串,然后获取整个 ISO 字符串并将其转换为 Luxon DateTime 数据结构。它还会告诉 Luxon 您想要以天为单位的持续时间。
  • 将 diff() 的结果转换为更可用的对象。此时,表达式返回。例如,3 月 9 日, 。
  • 使用 JMESPath 语法从对象中检索天数。有关将 JMESPath 与 n8n 结合使用的更多信息,请参阅我们的JMESpath文档。这将以负数形式返回距离圣诞节还有多少天。
  • 将数字转换为字符串并删除。
  • :另一个字符串,用将其连接到前一个字符串。
  • : 表示表达式的结束。
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 天!”。

代码作用的详细解释:

  • :一个字符串。
  • :用于连接两个字符串。
  • :这与获取两个日期之间的时间中的示例类似,但它使用了 n8n 的自定义变量。
  • :此部分使用 获取当前年份,将其连同月份和日期一起转换为 ISO 字符串,然后获取整个 ISO 字符串并将其转换为 Luxon DateTime 数据结构。它还会告诉 Luxon 您想要以天为单位的持续时间。
  • 将 diff() 的结果转换为更可用的对象。此时,表达式返回。例如,3 月 9 日, 。
  • 使用 JMESPath 语法从对象中检索天数。有关将 JMESPath 与 n8n 结合使用的更多信息,请参阅我们的JMESpath文档。这将以负数形式返回距离圣诞节还有多少天。
  • 将数字转换为字符串并删除。
  • :另一个字符串,用将其连接到前一个字符串。