ИНСТР-REGEX-DATEISO 8601 / ДД.ММ.ГГГГJS · Python · PHPревизия 2026-05-07

Regex для дат

Готовые regex для проверки дат: ISO 8601, ДД.ММ.ГГГГ, datetime, timestamp Unix. Валидация форматов в JS, Python, PHP.

⏱ работает в браузере · без регистрации
Инструмент · ИНСТР-REGEX-DATE|real-time
calcal.ru / regex-dlya-dat-data-vremeni
Загрузка...
6
Готовых шаблонов
ISO 8601
Стандарт
24h / 12h
Время
0
Запросов к серверу

Готовые шаблоны

Дата — частая необходимость в валидации форм. У 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, готовится к стандарту.
ИСТОЧНИКИ
  1. ISO 8601 — Data elements and interchange formats. ISO. iso.org/iso-8601-date-and-time-format.html. 2019.
  2. date-fns — Modern JavaScript date utility library. date-fns. date-fns.org. 2024.
  3. MDN — Regular Expressions. Mozilla. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions. 2024.
ЧАСТЫЕ ВОПРОСЫ

Часто задаваемые вопросы

ISO 8601 (YYYY-MM-DD): <code>^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$</code>. Проверяет: 4 цифры года, дефис, 01-12 месяц, дефис, 01-31 день. НЕ проверяет високосные годы и количество дней в месяце (31 февраля валидно по regex). Для строгой проверки — JavaScript Date или библиотека (date-fns, dayjs).
<code>^(0[1-9]|[12]\d|3[01])\.(0[1-9]|1[0-2])\.\d{4}$</code>. Проверяет: 01-31 день, точка, 01-12 месяц, точка, 4 цифры года. Стандарт для российских документов и форм. Принимает 31.02.2024 как валидное (regex не знает дней в месяцах). Для семантической проверки используйте: <code>const [d,m,y] = str.split("."); const date = new Date(y, m-1, d); if (date.getMonth() !== m-1) invalid;</code>
ISO 8601 с временем: <code>^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?$</code>. Принимает: 2024-05-15T14:30:00, 2024-05-15T14:30:00.123, 2024-05-15T14:30:00Z (UTC), 2024-05-15T14:30:00+03:00 (с timezone). Используется в API ответах, логах, базах данных.
ISO 8601 (YYYY-MM-DD HH:MM:SS) или Unix timestamp (число секунд с 1970). PostgreSQL TIMESTAMPTZ хранит как Unix внутри, отображает как ISO. MySQL DATETIME — строка. MongoDB — Date object (Unix). НЕ храните строки в произвольных форматах — превратится в ад при разных локалях. Стандарт: ISO 8601 для отображения, Unix для математики.
Regex не справится — это математика. JavaScript: <code>const isLeap = (y) =&gt; (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;</code>. Простой способ: создать Date и проверить что не «прыгнул»: <code>const d = new Date(y, m-1, day); if (d.getFullYear() === y && d.getMonth() === m-1 && d.getDate() === day) isValid;</code>. Если день «перепрыгнул» (29 февраля в не-високосный → 1 марта), Date это покажет.
Можно, но монстр получится. Например: <code>^\d{4}[-./]\d{2}[-./]\d{2}|\d{2}[-./]\d{2}[-./]\d{4}$</code>. Проблема: это допускает и YYYY-MM-DD и DD.MM.YYYY смешанные. Лучше: определите ОДИН формат для системы, валидируйте только его. Для пользовательского ввода — input mask + Date parsing вместо regex.
24-часовой формат: <code>^([01]\d|2[0-3]):([0-5]\d)(:([0-5]\d))?$</code>. Принимает 14:30, 14:30:45. 12-часовой с AM/PM: <code>^(0?\d|1[0-2]):([0-5]\d) ?(AM|PM|am|pm)$</code>. Принимает 2:30 PM, 02:30 AM. С timezone: добавьте <code>([+-]\d{2}:?\d{2}|Z)?</code> в конец.
Regex для них — плохая идея. Слишком много вариантов: «вчера», «позавчера», «3 дня назад», «неделю назад», «в прошлый понедельник». Используйте библиотеки: chrono-node (JavaScript), dateparser (Python), Sugar (JS). Они парсят естественный язык в Date object. Для русского языка работает chrono-node:ru.
Лиана Арифметова
АВТОРverifiedред. calcal.ru

Лиана Арифметова

Создатель и главный редактор

Миссия: демократизировать сложные расчёты. Превратить страх перед числами в ясность и контроль. Девиз: «Любая повторяющаяся задача заслуживает своего калькулятора».

Mathematical Engineering · МФТИ · редактирует каталог с 2012 года

Был ли этот калькулятор полезен?

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ

Инструмент справочный — не заменяет эксперта

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

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

Профессиональные решения — медицинские, финансовые, инженерные — должны приниматься только после консультации с квалифицированным специалистом. Не используйте автоматический расчёт как единственное основание для важных решений.

Ограничение ответственности. Авторы и разработчики сервиса не несут ответственности за прямой или косвенный ущерб, возникший из-за использования данных расчётов. Пользователь принимает на себя всю ответственность за интерпретацию результатов.