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В библиотеке validator.js предусмотрена функция
isRFC3339, предназначенная для проверки строк на
соответствие формату RFC 3339.
Сигнатура:
validator.isRFC3339(inputString)
Возвращаемое значение:
true — строка соответствует RFC 3339false — строка не соответствует стандарту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 ориентирована на практическое применение в веб-разработке, поэтому поведение функции учитывает следующие ограничения:
Отсутствие зоны делает строку невалидной:
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
RFC 3339 требует символ T:
validator.isRFC3339('2026-01-24 15:30:00Z');
// false
Допустимы только полные смещения в формате ±HH:mm:
validator.isRFC3339('2026-01-24T15:30:00+0200');
// false
validator.isRFC3339('2026-01-24T15:30:00+02:00');
// true
Проверяется не только структура, но и допустимость значений:
Пример:
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
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)
);
+2:00 // неверно
+02:00 // корректно
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, но с жёсткими ограничениями:
| Особенность | ISO 8601 | RFC 3339 |
|---|---|---|
| Разделитель | T или пробел |
только T |
| Часовой пояс | опционален | обязателен |
| Форматы дат | расширенные | ограниченные |
| Гибкость | высокая | низкая |
Validator.js ориентируется именно на строгую интерпретацию RFC 3339, исключая неоднозначные случаи ISO.
Валидация RFC 3339 часто комбинируется с дополнительными проверками:
if (
validator.isRFC3339(dateString) &&
validator.isISO8601(dateString)
) {
// дополнительная логика обработки
}
Такая комбинация применяется для систем, где данные могут поступать из разных источников с разной степенью строгости формата.
Проверка RFC 3339 в Validator.js реализована через регулярные выражения и дополнительные проверки диапазонов чисел. Это обеспечивает:
Использование строгого формата времени особенно важно в распределённых системах:
RFC 3339 снижает риск ошибок, связанных с локальными часовыми поясами и неоднозначной интерпретацией даты.
Функция isRFC3339 ожидает строку. Передача других типов
приводит к отрицательному результату:
validator.isRFC3339(1234567890);
// false
validator.isRFC3339(null);
// false
Даже если значение может быть преобразовано в дату, автоматическое приведение типов не выполняется.