Luxon으로 날짜와 시간 다루기
n8n v2.29Luxon은 날짜와 시간을 더 쉽게 다룰 수 있게 해주는 JavaScript 라이브러리입니다. n8n은 노드 간에 날짜를 문자열로 전달하므로, 이를 파싱해야 합니다. Luxon은 JavaScript 라이브러리입니다. Luxon은 n8n의 시간대를 사용합니다.
Luxon은 날짜와 시간을 더 쉽게 다룰 수 있게 해주는 JavaScript 라이브러리입니다. Luxon 사용법에 대한 전체 세부 정보는 Luxon 문서를 참고하세요.
n8n은 노드 간에 날짜를 문자열로 전달하므로, 이를 파싱해야 합니다. Luxon을 사용하면 이 작업이 더 쉬워집니다.
Python 지원
Luxon은 JavaScript 라이브러리입니다. n8n이 생성하는 두 가지 편의 변수는 Code node에서 Python을 사용할 때도 사용할 수 있지만, 그 기능은 제한적입니다.
- 이러한 변수에 대해 Luxon 연산을 수행할 수 없습니다. 예를 들어,
$today.minus(...)에 해당하는 Python 표현은 없습니다. - 날짜 문자열을 Luxon으로 변환과 같은 일반적인 Luxon 기능은 Python 사용자에게 제공되지 않습니다.
n8n에서 날짜와 시간의 동작 방식#
다음 사항에 유의하세요.
- 워크플로에서 n8n은 노드 사이에서 날짜와 시간을 문자열로 변환합니다. 다른 노드에서 가져온 날짜와 시간으로 산술 연산을 할 때 이 점을 염두에 두어야 합니다.
- n8n에서는 Luxon의
DateTime()을 사용하는 것이 권장되는 방식입니다. 순수 JavaScript의Date()를 사용하면 일부 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 GENERIC_TIMEZONE환경 변수로 설정한 n8n 인스턴스의 사용자 지정 시간대- 워크플로 설정에서 구성한 개별 워크플로의 사용자 지정 시간대
자주 사용하는 작업#
이 섹션에서는 몇 가지 일반적인 작업에 대한 예제를 제공합니다. 더 많은 예제와 자세한 안내는 Luxon 공식 문서에서 확인할 수 있습니다.
현재 날짜/시간 또는 날짜 가져오기#
현재 시간이나 날짜를 가져오려면 $now와 $today Luxon 객체를 사용하세요.
now: 현재 타임스탬프를 담고 있는 Luxon 객체입니다.DateTime.now()와 동일합니다.today: 현재 타임스탬프를 하루 단위로 내림한 값을 담고 있는 Luxon 객체입니다.DateTime.now().set({ hour: 0, minute: 0, second: 0, millisecond: 0 })과 동일합니다.
이러한 변수는 문자열로 변환될 때 서로 다른 시간 형식을 반환할 수 있다는 점에 유의하세요.
Expressions (JavaScript)
{{$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"
Code node (JavaScript)
$now
// n8n displays
// 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"
Code node (Python)
_now
# n8n displays
# 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() }}. - Code node에서는
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을 생성합니다. 예를 들면 다음과 같습니다.
Expressions (JavaScript)
{{DateTime.fromISO('2019-06-23T00:00:00.00')}}
Code node (JavaScript)
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 객체로 변환하려는 경우입니다.
Expressions (JavaScript)
{{DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")}}
Code node (JavaScript)
let newFormat = DateTime.fromFormat("23-06-2019", "dd-MM-yyyy")
애드혹 파싱을 사용할 때는 Luxon의 제한 사항 관련 경고를 참고하세요. 예상치 못한 결과가 나타난다면, 디버깅 가이드를 확인해보세요.
오늘로부터 n일 구하기#
오늘 이전 또는 이후의 특정 일수를 구합니다.
Expressions (JavaScript)
예를 들어, 필드가 항상 현재 날짜로부터 7일 전 날짜를 표시하도록 설정하고 싶다고 가정합니다.
표현식 편집기에 다음을 입력합니다.
{{$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})와 동일합니다.
Code node (JavaScript)
예를 들어, 현재 날짜로부터 7일 전 날짜를 담은 변수가 필요하다고 가정합니다.
코드 편집기에 다음을 입력합니다.
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})와 동일합니다.
더 자세한 정보와 예제는 다음을 참고하세요.
- Luxon의 수학 연산 가이드
- DateTime plus와 DateTime minus에 대한 API 문서
사람이 읽기 쉬운 날짜 만들기#
오늘로부터 n일 구하기의 예제에서는 현재 날짜로부터 7일 전의 날짜를 구해 [Object: "yyyy-mm-dd-T00:00:00.000+00:00"](표현식의 경우) 또는 yyyy-mm-dd-T00:00:00.000+00:00(Code node의 경우)로 반환합니다. 이를 더 읽기 쉽게 만들려면 Luxon의 포맷팅 함수를 사용할 수 있습니다.
예를 들어, 날짜를 담은 필드가 DD/MM/YYYY 형식으로 표시되기를 원한다면, 2019년 6월 23일에는 23/06/2019를 반환하게 됩니다.
이 표현식은 오늘로부터 7일 전 날짜를 구한 뒤, DD/MM/YYYY 형식으로 변환합니다.
Expressions (JavaScript)
{{$today.minus({days: 7}).toLocaleString()}}
Code node (JavaScript)
let readableSevenDaysAgo = $today.minus({days: 7}).toLocaleString()
형식을 변경할 수도 있습니다. 예를 들면 다음과 같습니다.
Expressions (JavaScript)
{{$today.minus({days: 7}).toLocaleString({month: 'long', day: 'numeric', year: 'numeric'})}}
2019년 6월 23일에는 "16 June 2019"를 반환합니다.
Code node (JavaScript)
let readableSevenDaysAgo = $today.minus({days: 7}).toLocaleString({month: 'long', day: 'numeric', year: 'numeric'})
2019년 6월 23일에는 "16 June 2019"를 반환합니다.
자세한 내용은 Luxon의 toLocaleString(사람이 읽기 쉬운 문자열) 가이드를 참고하세요.
두 날짜 사이의 시간 구하기#
두 날짜 사이의 시간을 구하려면 Luxon의 diff(차이) 기능을 사용하세요. 이 기능은 한 날짜에서 다른 날짜를 빼서 기간(duration)을 반환합니다.
예를 들어, 두 날짜 사이의 개월 수를 구해보겠습니다.
Expressions (JavaScript)
{{DateTime.fromISO('2019-06-23').diff(DateTime.fromISO('2019-05-23'), 'months').toObject()}}
이는 [Object: {"months":1}]을 반환합니다.
Code node (JavaScript)
let monthsBetweenDates = DateTime.fromISO('2019-06-23').diff(DateTime.fromISO('2019-05-23'), 'months').toObject()
이는 {"months":1}을 반환합니다.
자세한 내용은 Luxon의 Diffs를 참고하세요.
더 긴 예제: 크리스마스까지 며칠 남았을까?#
이 예제는 여러 Luxon 기능을 함께 사용하고, JMESPath를 활용하며, 기본적인 문자열 조작을 수행합니다.
시나리오: 12월 25일까지 남은 날짜를 카운트다운하고 싶습니다. 매일 크리스마스까지 남은 일수를 알려주어야 하며, 매년 업데이트할 필요 없이 모든 연도에 대해 원활하게 동작해야 합니다.
Expressions (JavaScript)
{{"There are " + $today.diff(DateTime.fromISO($today.year + '-12-25'), 'days').toObject().days.toString().substring(1) + " days to Christmas!"}}
이는 "There are <number of days> days to Christmas!"를 출력합니다. 예를 들어 3월 9일에는 "There are 291 days to Christmas!"를 출력합니다.
이 표현식이 하는 일에 대한 자세한 설명입니다.
{{: 표현식의 시작을 나타냅니다."There are ": 문자열입니다.+: 두 문자열을 결합하는 데 사용됩니다.$today.diff(): 두 날짜 사이의 시간 구하기의 예제와 유사하지만, n8n의 커스텀$today변수를 사용합니다.DateTime.fromISO($today.year + '-12-25'), 'days': 이 부분은$today.year를 사용해 현재 연도를 가져오고, 월과 일을 붙여 ISO 문자열로 만든 다음, 이 전체 ISO 문자열을 Luxon DateTime 데이터 구조로 변환합니다. 또한 Luxon에게 일(days) 단위의 기간을 원한다고 알려줍니다.toObject()는 diff()의 결과를 더 사용하기 쉬운 객체로 변환합니다. 이 시점에서 표현식은[Object: {"days":-<number-of-days>}]를 반환합니다. 예를 들어 3월 9일에는[Object: {"days":-291}]입니다..days는 JMESPath 문법을 사용해 객체에서 일수만 가져옵니다. n8n에서 JMESPath를 사용하는 방법에 대한 자세한 내용은 JMESpath 문서를 참고하세요. 이렇게 하면 크리스마스까지 남은 일수를 음수로 얻게 됩니다..toString().substring(1)은 숫자를 문자열로 바꾸고-를 제거합니다.+ " days to Christmas!": 이전 문자열과 결합하기 위해+를 사용하는 또 다른 문자열입니다.}}: 표현식의 끝을 나타냅니다.
Code node (JavaScript)
let daysToChristmas = "There are " + $today.diff(DateTime.fromISO($today.year + '-12-25'), 'days').toObject().days.toString().substring(1) + " days to Christmas!";
이는 "There are <number of days> days to Christmas!"를 출력합니다. 예를 들어 3월 9일에는 "There are 291 days to Christmas!"를 출력합니다.
이 코드가 하는 일에 대한 자세한 설명입니다.
"There are ": 문자열입니다.+: 두 문자열을 결합하는 데 사용됩니다.$today.diff(): 두 날짜 사이의 시간 구하기의 예제와 유사하지만, n8n의 커스텀$today변수를 사용합니다.DateTime.fromISO($today.year + '-12-25'), 'days': 이 부분은$today.year를 사용해 현재 연도를 가져오고, 월과 일을 붙여 ISO 문자열로 만든 다음, 이 전체 ISO 문자열을 Luxon DateTime 데이터 구조로 변환합니다. 또한 Luxon에게 일(days) 단위의 기간을 원한다고 알려줍니다.toObject()는 diff()의 결과를 더 사용하기 쉬운 객체로 변환합니다. 이 시점에서 표현식은[Object: {"days":-<number-of-days>}]를 반환합니다. 예를 들어 3월 9일에는[Object: {"days":-291}]입니다..days는 JMESPath 문법을 사용해 객체에서 일수만 가져옵니다. n8n에서 JMESPath를 사용하는 방법에 대한 자세한 내용은 JMESpath 문서를 참고하세요. 이렇게 하면 크리스마스까지 남은 일수를 음수로 얻게 됩니다..toString().substring(1)은 숫자를 문자열로 바꾸고-를 제거합니다.+ " days to Christmas!": 이전 문자열과 결합하기 위해+를 사용하는 또 다른 문자열입니다.