Проверка RFC 3339

RFC 3339 определяет строгий профиль представления даты и времени на основе ISO 8601. Он используется в веб-API, логировании, обмене данными между сервисами и везде, где требуется однозначная интерпретация временных меток без двусмысленности, связанной с локальными форматами.

Основная цель стандарта — устранение вариативности в записи даты и времени, которая присутствует в «полном» ISO 8601. RFC 3339 фиксирует допустимые варианты записи, запрещает неоднозначные конструкции и требует обязательного указания временной зоны.

Формат RFC 3339 можно представить как:

YYYY-MM-DDTHH:mm:ssZ
YYYY-MM-DDTHH:mm:ss±HH:mm

Ключевые элементы:

  • Дата: YYYY-MM-DD

  • Разделитель даты и времени: T

  • Время: HH:mm:ss (24-часовой формат)

  • Часовой пояс:

    • Z (UTC)
    • смещение +HH:mm или -HH:mm

Примеры корректных значений:

2026-01-24T15:30:00Z
2026-01-24T15:30:00+06:00
2026-01-24T15:30:00-03:30

Неподдерживаемые конструкции:

  • отсутствие временной зоны
  • использование пробела вместо T
  • дробные секунды в расширенных вариантах (в строгом RFC 3339 допустимы, но валидация может быть ограничена реализацией)
  • сокращённые записи даты

Проверка RFC 3339 в Validator.js

В библиотеке validator.js предусмотрена функция isRFC3339, предназначенная для проверки строк на соответствие формату RFC 3339.

Сигнатура:

validator.isRFC3339(inputString)

Возвращаемое значение:

  • true — строка соответствует RFC 3339
  • false — строка не соответствует стандарту

Базовое использование проверки

import validator from 'validator';

validator.isRFC3339('2026-01-24T15:30:00Z');
// true

validator.isRFC3339('2026-01-24 15:30:00');
// false

Функция выполняет строгую проверку структуры строки без попытки «исправления» или приведения типов.


Строгость проверки и особенности реализации

Реализация RFC 3339 в Validator.js ориентирована на практическое применение в веб-разработке, поэтому поведение функции учитывает следующие ограничения:

1. Обязательная временная зона

Отсутствие зоны делает строку невалидной:

validator.isRFC3339('2026-01-24T15:30:00');
// false

Корректные варианты:

validator.isRFC3339('2026-01-24T15:30:00Z');
// true

validator.isRFC3339('2026-01-24T15:30:00+02:00');
// true

2. Разделитель даты и времени

RFC 3339 требует символ T:

validator.isRFC3339('2026-01-24 15:30:00Z');
// false

3. Формат смещения времени

Допустимы только полные смещения в формате ±HH:mm:

validator.isRFC3339('2026-01-24T15:30:00+0200');
// false

validator.isRFC3339('2026-01-24T15:30:00+02:00');
// true

4. Валидация календарных значений

Проверяется не только структура, но и допустимость значений:

  • месяц не может быть больше 12
  • день не может превышать количество дней в месяце
  • часы ограничены диапазоном 00–23
  • минуты и секунды — 00–59

Пример:

validator.isRFC3339('2026-13-24T10:00:00Z');
// false

Поддержка секунд и дробных значений

RFC 3339 допускает доли секунды:

2026-01-24T15:30:00.123Z

В Validator.js поддержка зависит от версии и конфигурации, но в большинстве реализаций допускаются миллисекунды:

validator.isRFC3339('2026-01-24T15:30:00.123Z');
// true

Практическое применение проверки

Валидация API-входных данных

function validatePayload(payload) {
  if (!validator.isRFC3339(payload.timestamp)) {
    throw new Error('Неверный формат временной метки');
  }
}

Проверка логов событий

При обработке событийных потоков важно гарантировать единый формат времени:

events.forEach(event => {
  if (validator.isRFC3339(event.createdAt)) {
    processEvent(event);
  }
});

Фильтрация данных перед сохранением

const validRecords = records.filter(record =>
  validator.isRFC3339(record.date)
);

Типичные ошибки при использовании RFC 3339

Отсутствие нуля в смещении

+2:00  // неверно
+02:00 // корректно

Использование пробела вместо T

2026-01-24 12:00:00Z // неверно
2026-01-24T12:00:00Z // корректно

Неполный часовой пояс

2026-01-24T12:00Z // допустимо (UTC)
2026-01-24T12:00+02 // неверно

Сравнение RFC 3339 и ISO 8601 в контексте валидации

RFC 3339 является подмножеством ISO 8601, но с жёсткими ограничениями:

Особенность ISO 8601 RFC 3339
Разделитель T или пробел только T
Часовой пояс опционален обязателен
Форматы дат расширенные ограниченные
Гибкость высокая низкая

Validator.js ориентируется именно на строгую интерпретацию RFC 3339, исключая неоднозначные случаи ISO.


Использование в связке с другими проверками

Валидация RFC 3339 часто комбинируется с дополнительными проверками:

if (
  validator.isRFC3339(dateString) &&
  validator.isISO8601(dateString)
) {
  // дополнительная логика обработки
}

Такая комбинация применяется для систем, где данные могут поступать из разных источников с разной степенью строгости формата.


Производительность проверки

Проверка RFC 3339 в Validator.js реализована через регулярные выражения и дополнительные проверки диапазонов чисел. Это обеспечивает:

  • линейную сложность O(n)
  • отсутствие необходимости в парсинге Date объекта
  • предсказуемое поведение на больших массивах данных

Роль RFC 3339 в экосистеме JavaScript

Использование строгого формата времени особенно важно в распределённых системах:

  • микросервисы
  • event-driven архитектуры
  • REST и GraphQL API
  • системы логирования
  • очереди сообщений

RFC 3339 снижает риск ошибок, связанных с локальными часовыми поясами и неоднозначной интерпретацией даты.


Поведение при некорректных типах данных

Функция isRFC3339 ожидает строку. Передача других типов приводит к отрицательному результату:

validator.isRFC3339(1234567890);
// false

validator.isRFC3339(null);
// false

Даже если значение может быть преобразовано в дату, автоматическое приведение типов не выполняется.