Date and time with Luxon#
Luxon is a JavaScript library that makes it easier to work with date and time. For full details of how to use Luxon, refer to Luxon's documentation.
Variables#
n8n uses Luxon to provide two custom variables:
$now
: a Luxon object containing the current timestamp. Equivalent toDateTime.now()
.$today
: a Luxon object containing the current timestamp, rounded down to the day. Equivalent toDateTime.now().set({ hour: 0, minute: 0, second: 0, millisecond: 0 })
.
Note that these variables can return different time formats when cast as a string. This is the same behavior as Luxon's DateTime.now()
.
1 2 3 4 5 6 |
|
Setting the timezone in n8n#
Luxon uses the n8n timezone. This value is either:
- Default:
America/New York
- A custom timezone for your n8n instance, set using the
GENERIC_TIMEZONE
environment variable. - A custom timezone for an individual workflow, configured in workflow settings.
Date and time behavior in n8n#
Be aware of the following:
- In a workflow, n8n converts dates and times to strings between nodes. Keep this in mind when doing arithmetic on dates and times from other nodes.
- With vanilla JavaScript, you can convert a string to a date with
new Date('2019-06-23')
. In Luxon, you must use a function explicitly stating the format, such asDateTime.fromISO('2019-06-23')
orDateTime.fromFormat("23-06-2019", "dd-MM-yyyy")
.
Common tasks#
This section provides examples for some common operations. More examples, and detailed guidance, are available in Luxon's own documentation.
Convert date string to Luxon#
You can convert date strings and other date formats to a Luxon DateTime object. You can convert from standard formats and from arbitrary strings.
A difference between Luxon DateTime and JavaScript Date
With vanilla JavaScript, you can convert a string to a date with new Date('2019-06-23')
. In Luxon, you must use a function explicitly stating the format, such as DateTime.fromISO('2019-06-23')
or DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")
.
If you have a date in a supported standard technical format:#
Most dates use fromISO()
. This creates a Luxon DateTime from an ISO 8601 string. For example:
1 |
|
Luxon's API documentation has more information on fromISO.
Luxon provides functions to handle conversions for a range of formats. Refer to Luxon's guide to Parsing technical formats for details.
If you have a date as a string that doesn't use a standard format:#
Use Luxon's Ad-hoc parsing. To do this, use the fromFormat()
function, providing the string and a set of tokens that describe the format.
For example, you have n8n's founding date, 23rd June 2019, formatted as '23-06-2019'. You want to turn this into a Luxon object:
1 |
|
When using ad-hoc parsing, note Luxon's warning about Limitations. If you see unexpected results, try their Debugging guide.
Get n days from today#
Get a number of days before or after today.
For example, you want a variable containing the date seven days before the current date.
In the code editor, enter:
1 |
|
On the 23rd June 2019, this returns [Object: "2019-06-16T00:00:00.000+00:00"]
.
This example uses n8n's custom variable $today
for convenience. It's the equivalent of DateTime.now().set({ hour: 0, minute: 0, second: 0, millisecond: 0 }).minus({days: 7})
.
For more detailed information and examples, refer to:
- Luxon's guide to math
- Their API documentation on DateTime plus and DateTime minus
Create human-readable dates#
In Get n days from today, the example gets the date seven days before the current date, and returns it as yyyy-mm-dd-T00:00:00.000+00:00
. To make this more readable, you can use Luxon's formatting functions.
For example, you want the field containing the date to be formatted as DD/MM/YYYY, so that on the 23rd June 2019, it returns 23/06/2019
This expression gets the date seven days before today, and converts it to the DD/MM/YYYY format.
1 |
|
You can alter the format. For example:
1 |
|
On 23rd June 2019, this returns "16 June 2019".
Refer to Luxon's guide on toLocaleString (strings for humans) for more information.
Get the time between two dates#
To get the time between two dates, use Luxon's diffs feature. This subtracts one date from another and returns a duration.
For example, get the number of months between two dates:
1 |
|
This returns {"months":1}
.
Refer to Luxon's Diffs for more information.
A longer example: How many days to Christmas?#
This example brings together several Luxon features, uses JMESPath, and does some basic string manipulation.
The scenario: you want a countdown to 25th December. Every day, it should tell you the number of days remaining to Christmas. You don't want to update it for next year - it needs to seamelessly work for every year.
1 |
|
This outputs "There are <number of days> days to Christmas!"
. For example, on 9th March, it outputs "There are 291 days to Christmas!".
A detailed explanation of what the code does:
"There are "
: a string.+
: used to join two strings.$today.diff()
: This is similar to the example in Get the time between two dates, but it uses n8n's custom$today
variable.DateTime.fromISO($today.year + '-12-25'), 'days'
: this part gets the current year using$today.year
, turns it into an ISO string along with the month and date, and then takes the whole ISO string and converts it to a Luxon DateTime data structure. It also tells Luxon that you want the duration in days.toObject()
turns the result of diff() into a more usable object. At this point, the expression returns[Object: {"days":-<number-of-days>}]
. For example, on 9th March,[Object: {"days":-291}]
..days
uses JMESPath syntax to retrieve just the number of days from the object. For more information on using JMESPath with n8n, refer to our JMESpath documentation. This gives you the number of days to Christmas, as a negative number..toString().substring(1)
turns the number into a string and removes the-
.+ " days to Christmas!"
: another string, with a+
to join it to the previous string.