Манипуляции с датами в n8n: Добавление дней и подробное руководство по работе с временными данными
В n8n, мощной платформе автоматизации рабочих процессов, операции с датами и временем являются фундаментальными для построения логики, планирования задач и обработки данных. Одной из наиболее частых потребностей является добавление определенного количества дней к существующей дате. Эта операция используется для расчета сроков выполнения, определения дат напоминаний, вычисления интервалов и множества других бизнес-процессов. В отличие от многих других инструментов, n8n предоставляет гибкий, но требующий понимания подход к манипуляции датами, основанный на использовании встроенных функций выражений (Expression) и узлов.
Основные методы добавления дней к дате в n8n
В n8n не существует единого специализированного узла «Добавить день к дате». Вместо этого эта операция выполняется с помощью комбинации узлов и функций. Существует два основных подхода: использование Функций выражений (Expression Functions) и использование узла «Date & Time».
Способ 1: Использование Функций выражений (Expression)
Это наиболее гибкий и распространенный метод, позволяющий выполнять вычисления непосредственно в полях узлов. Основная функция для работы с датами в Expression – $now и методы объекта JavaScript Date, создаваемого через new Date().
Базовый синтаксис:
{{$now.plus(3, 'days')}}– добавляет 3 дня к текущей дате и времени.{{new Date('2023-12-01').plus(5, 'days')}}– добавляет 5 дней к указанной конкретной дате.- Предположим, у вас есть поле
startDateсо значением «2023-11-20». - Выражение для добавления 7 дней будет выглядеть так:
{{new Date($json.startDate).plus(7, 'days').toISOString()}}. - Метод
.toISOString()преобразует результат обратно в строку в стандартном формате ISO (например, «2023-11-27T00:00:00.000Z»). - Узел (например, «Google Sheets») извлекает исходную дату.
- Узел «Set» (или Function) используется для создания нового поля. В значении поля применяется Expression, подобное
{{new Date($json.dateField).plus(10, 'days')}}. - Дополнительно может использоваться узел «Date & Time» для приведения результата к нужному строковому формату (например, DD/MM/YYYY).
- Узел «Google Sheets» (или «MySQL»): получает данные, включая поле
deadline. - Узел «Set»: создает новое поле
reminderDate.- Значение:
{{new Date($json.deadline).minus(3, 'days').toFormat('yyyy-MM-dd')}}
- Значение:
- Узел «IF»: проверяет, равна ли вычисленная дата напоминания сегодняшней дате (
{{$now.toFormat('yyyy-MM-dd')}}). - Если условие истинно, узел «Email» или «Telegram» отправляет уведомление.
- Узел «Webhook» получает данные о регистрации, включая
signupDate. - Узел «Function» или «Set» выполняет вычисление:
const expiry = new Date($json.signupDate).plus(30, 'days').toISOString();return { ...$json, trialExpiryDate: expiry };
- Данные с рассчитанной датой отправляются в базу данных через узел «Postgres» или аналогичный.
- Для хранения и передачи дат между системами всегда используйте UTC (
.toISOString()). - Для отображения пользователю конвертируйте UTC в локальный часовой пояс, используя метод
.toLocaleString()или функцию$now.inTimezone('Europe/Moscow'). - Пример добавления дней с учетом конкретного часового пояса:
{{$now.inTimezone('America/New_York').plus(1, 'day').toFormat('HH:mm ZZZZ')}}. - Проверка валидности даты:
{{ $json.dateField ? new Date($json.dateField).isValid ? 'Valid' : 'Invalid' : 'Field is empty' }}. - Использование блока
try-catchв узле «Function» для обработки исключений при парсинге дат. - Задание даты по умолчанию при ошибке:
{{ $json.dateField ? new Date($json.dateField).isValid ? new Date($json.dateField).plus(1,'day') : $now : $now }}.
Для работы с датами, которые получены из предыдущих узлов (например, из базы данных, Google Таблиц, HTTP-запроса), необходимо сначала преобразовать их в объект Date.
Пример выражения для добавления дней к дате из входных данных:
Способ 2: Использование узла «Date & Time»
Узел «Date & Time» предназначен для форматирования и преобразования временных меток. Прямого действия «добавить день» в нем нет, но его можно использовать в комбинации с Expression или для извлечения компонентов даты.
Типичный рабочий процесс с использованием обоих методов:
Детальное описание функций и параметров
Метод .plus() и его противоположность .minus() являются частью библиотеки Luxon, интегрированной в n8n. Их синтаксис: объектДаты.plus({объект с интервалом}) или объектДаты.plus(количество, 'единица_измерения').
| Параметр | Описание | Пример | Результат (для даты 2023-01-01) |
|---|---|---|---|
| Количество (number) | Целое число дней (или других единиц), которое нужно добавить. Может быть отрицательным. | $now.plus(5, 'days') |
2023-01-06T[текущее время] |
| Единица измерения (string) | Тип добавляемого интервала. Основные единицы: ‘years’, ‘months’, ‘weeks’, ‘days’, ‘hours’, ‘minutes’, ‘seconds’, ‘milliseconds’. | $now.plus(1, 'month') |
2023-02-01T[текущее время] |
| Объект интервала | Позволяет добавить составной интервал. | $now.plus({days: 2, hours: 6}) |
Текущая дата + 2 дня и 6 часов. |
Форматирование результирующей даты
После вычисления новой даты часто требуется вывести ее в специфичном формате. Для этого используются методы форматирования.
| Метод/Функция | Назначение | Пример выражения | Пример вывода |
|---|---|---|---|
.toISOString() |
Преобразование в строку в формате ISO 8601 (UTC). | {{$now.plus(1,'day').toISOString()}} |
2023-11-28T12:30:45.123Z |
.toFormat('dd.MM.yyyy') |
Преобразование в строку по пользовательскому формату с использованием Luxon. | {{$now.plus(1,'day').toFormat('dd.MM.yyyy HH:mm')}} |
28.11.2023 15:30 |
| Узел «Date & Time» | Визуальный выбор формата из списка. | Настройка узла: поле «To Format» -> «MM/DD/YYYY». | 11/28/2023 |
Практические примеры рабочих процессов (Workflows)
Пример 1: Автоматическое напоминание за 3 дня до дедлайна
Цель: Взять дату дедлайна из строки таблицы, вычислить дату напоминания (за 3 дня) и отправить сообщение.
Пример 2: Расчет даты окончания пробной подписки (30 дней с момента регистрации)
Цель: При получении новой регистрации рассчитать дату истечения пробного периода.
Работа с часовыми поясами
Одна из самых сложных аспектов работы с датами. По умолчанию $now и new Date() в выражениях используют часовой пояс системы, на которой работает n8n. Метод .toISOString() всегда конвертирует время в UTC (обозначается окончанием ‘Z’).
Рекомендации:
Обработка ошибок и валидация
При работе с пользовательским вводом или нестабильными источниками данных критически важна обработка ошибок.
Ответы на часто задаваемые вопросы (FAQ)
Как добавить рабочие дни (исключая выходные) в n8n?
Встроенной функции для этого нет. Требуется создание пользовательской логики в узле «Function» (Code). Алгоритм: в цикле добавлять по одному дню и проверять, является ли полученный день субботой (6) или воскресеньем (0) с помощью метода .getDay() объекта Date, пропуская их в подсчете.
Почему выражение {{$json.myDate + 1}} не работает для добавления дня?
Потому что $json.myDate в общем случае является строкой. Оператор «+» конкатенирует строки, а не выполняет арифметику с датами. Необходимо явное преобразование в объект Date через new Date() и использование метода .plus().
Как добавить переменное количество дней, которое хранится в другом поле?
Используйте выражение, где количество дней — это динамическое значение: {{new Date($json.startDate).plus($json.daysToAdd, 'days')}}. Убедитесь, что поле daysToAdd содержит целое число.
Как вычесть дни из даты в n8n?
Используйте метод .minus() с аналогичным синтаксисом: {{$now.minus(5, 'days')}} или {{new Date($json.myDate).minus($json.daysToSubtract, 'days')}}.
Можно ли добавлять месяцы и годы с помощью .plus()? Что происходит при добавлении месяца к 31 января?
Да, можно: $now.plus(2, 'months'). Библиотека Luxon, используемая в n8n, обрабатывает «переполнение» корректно. Например, 31 января + 1 месяц = 28 или 29 февраля (в зависимости от високосного года). Если нужна «последняя день месяца» логика, требуется дополнительная обработка.
Как получить только дату (без времени) после добавления дней?
Используйте форматирование: {{$now.plus(1,'day').toFormat('yyyy-MM-dd')}}. Это вернет строку, например, «2023-11-28». Альтернативно, можно обнулить время: {{$now.plus(1,'day').startOf('day').toISOString()}}.
Почему дата в результате отображается со смещением часового пояса (например, +03:00)?
Это происходит при использовании методов, которые выводят дату в локальном часовом поясе (например, .toString() или .toLocaleString()). Чтобы избежать этого и получить дату в UTC, используйте .toISOString(). Для явного указания пояса используйте .toFormat('...', { timeZone: 'UTC' }) или .inTimezone().
Как эффективно отлаживать выражения с датами?
Используйте узел «Function» (Code) для вывода промежуточных значений в консоль: console.log(new Date($json.myDate)); console.log($now.toISOString());. Просматривайте логи выполнения workflow в интерфейсе n8n. Также используйте узел «Set» для поэтапного создания полей и проверки результатов на каждом шаге.
Добавить комментарий