N8n add day to date

Манипуляции с датами в 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 дней к указанной конкретной дате.

    Для работы с датами, которые получены из предыдущих узлов (например, из базы данных, Google Таблиц, HTTP-запроса), необходимо сначала преобразовать их в объект Date.

    Пример выражения для добавления дней к дате из входных данных:

    • Предположим, у вас есть поле startDate со значением «2023-11-20».
    • Выражение для добавления 7 дней будет выглядеть так: {{new Date($json.startDate).plus(7, 'days').toISOString()}}.
    • Метод .toISOString() преобразует результат обратно в строку в стандартном формате ISO (например, «2023-11-27T00:00:00.000Z»).

    Способ 2: Использование узла «Date & Time»

    Узел «Date & Time» предназначен для форматирования и преобразования временных меток. Прямого действия «добавить день» в нем нет, но его можно использовать в комбинации с Expression или для извлечения компонентов даты.

    Типичный рабочий процесс с использованием обоих методов:

    1. Узел (например, «Google Sheets») извлекает исходную дату.
    2. Узел «Set» (или Function) используется для создания нового поля. В значении поля применяется Expression, подобное {{new Date($json.dateField).plus(10, 'days')}}.
    3. Дополнительно может использоваться узел «Date & Time» для приведения результата к нужному строковому формату (например, DD/MM/YYYY).

    Детальное описание функций и параметров

    Метод .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 дня) и отправить сообщение.

    1. Узел «Google Sheets» (или «MySQL»): получает данные, включая поле deadline.
    2. Узел «Set»: создает новое поле reminderDate.
      • Значение: {{new Date($json.deadline).minus(3, 'days').toFormat('yyyy-MM-dd')}}
    3. Узел «IF»: проверяет, равна ли вычисленная дата напоминания сегодняшней дате ({{$now.toFormat('yyyy-MM-dd')}}).
    4. Если условие истинно, узел «Email» или «Telegram» отправляет уведомление.

    Пример 2: Расчет даты окончания пробной подписки (30 дней с момента регистрации)

    Цель: При получении новой регистрации рассчитать дату истечения пробного периода.

    1. Узел «Webhook» получает данные о регистрации, включая signupDate.
    2. Узел «Function» или «Set» выполняет вычисление:
      • const expiry = new Date($json.signupDate).plus(30, 'days').toISOString();
      • return { ...$json, trialExpiryDate: expiry };
    3. Данные с рассчитанной датой отправляются в базу данных через узел «Postgres» или аналогичный.

    Работа с часовыми поясами

    Одна из самых сложных аспектов работы с датами. По умолчанию $now и new Date() в выражениях используют часовой пояс системы, на которой работает n8n. Метод .toISOString() всегда конвертирует время в UTC (обозначается окончанием ‘Z’).

    Рекомендации:

    • Для хранения и передачи дат между системами всегда используйте 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 }}.

Ответы на часто задаваемые вопросы (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» для поэтапного создания полей и проверки результатов на каждом шаге.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *