Готовые шаблоны
Дата — частая необходимость в валидации форм. У regex есть фундаментальное ограничение: он проверяет ФОРМАТ, не СЕМАНТИКУ. «31.02.2024» — невалидная дата (февраль не имеет 31), но regex её принимает. Для строгой проверки используйте Date парсинг, regex — только первая линия защиты.
Шаблон 1 — ISO 8601 дата (YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$Принимает: 2024-05-15, 2024-12-31, 1970-01-01. Не принимает: 2024-13-01 (нет 13 месяца), 2024/05/15 (не дефис).
Шаблон 2 — Русский формат (ДД.ММ.ГГГГ)
^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.\d{4}$Принимает: 15.05.2024, 01.01.1970, 31.12.2024. Стандарт для российских документов, форм Госуслуг.
Шаблон 3 — Datetime ISO 8601
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$Принимает: 2024-05-15T14:30:00, 2024-05-15T14:30:00Z, 2024-05-15T14:30:00.123Z, 2024-05-15T14:30:00+03:00. Стандарт для API.
Шаблон 4 — Время 24-часовое (HH:MM или HH:MM:SS)
^([01]\d|2[0-3]):([0-5]\d)(:([0-5]\d))?$
Принимает: 14:30, 14:30:45, 09:00:00, 23:59:59. Не принимает: 24:00 (нет 24 часа), 14:60 (нет 60 минут).
Шаблон 5 — Время 12-часовое (с AM/PM)
^(0?[1-9]|1[0-2]):([0-5]\d) ?(AM|PM|am|pm)$
Принимает: 2:30 PM, 02:30 AM, 12:00 pm. Не принимает: 13:00 PM, 0:30 AM.
Шаблон 6 — Unix timestamp
^\d{10}$|^\d{13}$10 цифр — Unix timestamp в секундах (с 2001 по 2286). 13 цифр — миллисекунды (стандарт JavaScript Date.now()).
ISO 8601 specifies a unified, unambiguous format for date and time. The recommended representation is YYYY-MM-DD for dates and HH:MM:SS for times, separated by 'T' for combined datetime: YYYY-MM-DDTHH:MM:SS.— ISO 8601 — Date and time format, ISO standard
ISO 8601 — детально
ISO 8601 — международный стандарт, поддерживается всеми системами. Используется в JSON API, БД, логах, файловых именах. Главные правила:
- Дата. YYYY-MM-DD. Год всегда 4 цифры (с ведущими нулями), месяц и день — 2 цифры.
- Время. HH:MM:SS. 24-часовой формат, с ведущими нулями.
- Дата + время. Соединяются через T (можно пробелом, но T — стандарт): 2024-05-15T14:30:00.
- Доли секунды. Точка + N цифр: 2024-05-15T14:30:00.123 (миллисекунды), .123456 (микросекунды).
- Timezone. Z = UTC. +03:00 = UTC+3 (МСК). -05:00 = UTC-5 (EST).
- Без timezone. Считается «местным временем» — потенциально опасно, разные системы интерпретируют по-разному.
Практические сценарии
Frontend форма — валидация даты рождения
function validateBirthday(input) {
// 1. Проверка формата (regex для ДД.ММ.ГГГГ)
if (!/^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.\d{4}$/.test(input)) {
return { valid: false, error: 'Неверный формат. Используйте ДД.ММ.ГГГГ' };
}
// 2. Проверка что дата существует (семантика)
const [d, m, y] = input.split('.').map(Number);
const date = new Date(y, m - 1, d);
if (date.getFullYear() !== y || date.getMonth() !== m - 1 || date.getDate() !== d) {
return { valid: false, error: 'Несуществующая дата' };
}
// 3. Проверка что в прошлом
if (date > new Date()) {
return { valid: false, error: 'Дата в будущем' };
}
// 4. Проверка возраста (старше 14 лет)
const minAge = new Date();
minAge.setFullYear(minAge.getFullYear() - 14);
if (date > minAge) {
return { valid: false, error: 'Регистрация с 14 лет' };
}
return { valid: true };
}Backend (Python) — парсинг даты
import re
from datetime import datetime
def parse_date_ru(s):
# Проверка формата
if not re.match(r'^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.\d{4}$', s):
return None
# Парсинг
try:
return datetime.strptime(s, '%d.%m.%Y').date()
except ValueError:
# 31 февраля и подобные
return None
# Использование
date = parse_date_ru('15.05.2024') # date(2024, 5, 15)
date = parse_date_ru('31.02.2024') # NoneПодводные камни
- Високосные годы. Regex не знает что 2024 високосный, а 2023 нет. Используйте Date парсинг для семантики.
- Дни в месяцах. Февраль 28/29, апрель 30. Regex принимает 31.02 — недопустимо.
- Локали. Русский DD.MM.YYYY, US MM/DD/YYYY, ISO YYYY-MM-DD. Один regex для всех = ошибки.
- Timezone ambiguity. «2024-05-15 14:30:00» без TZ — какое время? UTC? МСК? Серверное? Всегда указывайте Z или offset.
- Daylight Saving Time. Россия не переходит на летнее время с 2014, но Европа и США переходят. Это создаёт «дыры» в локальном времени дважды в год.
- Year 2038 problem. 32-bit Unix timestamp переполнится в 2038-01-19. Используйте 64-bit timestamps.
- Year 10000 problem. Многие regex \\d{4} не примут 5-значные годы. Через 7976 лет программисты будут возмущаться нашим коду.
Альтернативы regex
- Date object (нативно). JavaScript: new Date(str). Python: datetime.fromisoformat(str). Парсит ISO 8601 нативно.
- date-fns / dayjs (JavaScript). Современные библиотеки для работы с датами. parseISO, isValid, format.
- moment.js. Был стандартом, но с 2020 в legacy mode. Не рекомендуется для новых проектов (heavy bundle).
- chrono-node. Парсинг естественного языка: «next monday», «3 days ago», «вчера».
- luxon. Современная замена moment с лучшей timezone-поддержкой.
- Temporal API (proposal). Будущий native JS API для дат. Stage 3, готовится к стандарту.
- ISO 8601 — Data elements and interchange formats. ISO. iso.org/iso-8601-date-and-time-format.html. 2019.
- date-fns — Modern JavaScript date utility library. date-fns. date-fns.org. 2024.
- MDN — Regular Expressions. Mozilla. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions. 2024.
