Numlex Документация
Справочник синтаксиса
Сообщить о проблеме

Даты и время

Полный справочник по времени: даты, арифметика длительностей, часы, часовые пояса, таймстемпы и ISO, Timespan, видео-таймкод, рабочие календари и особые даты.

Numlex рассматривает даты и время как полноценные величины со строгой, ограниченной грамматикой. Строка либо точно соответствует образцу даты или времени, либо остаётся обычной прозой — May 5 + 3 weeks работает, May 5 + 43 — ошибка, а одинокое слово-месяц не является датой. Календарная арифметика компонентная, по локальному григорианскому календарю, поэтому переход на летнее время не может сдвинуть день.

Эта страница — полный справочник по времени: календарные даты, арифметика длительностей, часы и laptime, часовые пояса, таймстемпы и ISO 8601, нотация Timespan, видео-таймкод и кадры, рабочие календари, особые даты, их зависимость от настроек и строгие правила ошибок.

Календарные даты

<date> [ <sign> <integer> <duration> ... ]
<date>     := today | tomorrow | yesterday
             | <month> <day>
             | <month> <day>, <year>
             | <day> <month> [<year>]
<duration> := day(s) | week(s) | month(s) | year(s)

Все слова английские и не зависят от регистра; знак — + или − (ASCII - тоже работает). Месяцы, сокращённые и полные:

№СокращенияПолное название
1janjanuary
2febfebruary
3marmarch
4aprapril
5maymay
6junjune
7juljuly
8augaugust
9sep, septseptember
10octoctober
11novnovember
12decdecember

today, tomorrow и yesterday разрешаются по захваченной локальной дате и комбинируются с длительностями. Составные периоды применяются по компонентам календаря: March 12 + 3 weeks 2 days → Apr 4, May 10 - 1 week 3 days. Каждый компонент ограничен 1 000 000.

Результат показывает год, если год задан во вводе или результат выходит за год ввода. Привязка — локальный полдень, поэтому переходы DST никогда не сдвигают день.

today                       → today (per the local calendar)
tomorrow + 1 month
yesterday - 2 weeks
May 5                       → May 5 (current year)
May 5, 2026 + 30 days       → Jun 4, 2026
5 May 2026
dec 31

Ошибки синтаксиса дат:

  • Периоды больше 1 000 000 — скрытая ошибка.
  • Feb 30 имеет форму даты, но недействителен — скрытая ошибка.
  • May 5 + 43 (число без слова длительности) — ошибка, никогда не «сбрасывается» в обычную арифметику.
  • May 5 + 43 days extra — хвост после валидной даты — ошибка.
  • Одинокое слово-месяц (may) не является датой; оно остаётся прозой.

Арифметика длительностей

Несколько фиксированных единиц времени подряд читаются как одна длительность:

  • 1 h 45 min, 1 hour 45 minutes, 2 hr 5 mins, 1 day 2 hours 30 min, 1 min 250 ms, 1 week 2 days.
  • Склеенные безопасные формы: 1h45min, 45min, 30sec, 500ms, 2hr, 2wks, 1day2hours30min. Склеенные алиасы берутся только из белого списка (ms s sec secs second(s) min mins minute(s) h hr hrs hour(s) day(s) week(s) wk wks); одиночная склеенная m никогда не минуты (5m = 5 000 000, 5 m = метры), а одиночная склеенная s не принимается.
  • Составные длительности используют фиксированные единицы от ms до week. Средние календарные единицы (mo, yr, quarter (time)) и посторонние единицы не компонуются неявно: 1 m 20 cm — ошибка, 1 mo 2 days не компонуется.

Компоненты могут идти в любом порядке и повторяться; значения суммируются. Группа связывается в один первичный операнд до умножения или деления:

1 h 30 min / 3        → 30 min        (not 1 h 10 min)
(1 h 20 min) × 2      → 2 h 40 min
3 × (1 h 15 min)      → 3 h 45 min
1 h 45 min + 30 min   → 2 h 15 min
2 hr 10 min - 45 min  → 1 h 25 min
1 day 2 h + 90 min    → 1 day 3 h 30 min
1 week 2 days - 1 day → 1 week 1 day
2 min 30 sec × 3      → 7 min 30 s
1 min 250 ms + 750 ms → 1 min 1 s
1.5 h + 30 min        → 2 h

Длительность остаётся настоящей типизированной величиной (размерность T¹, реальная единица времени, значение в её шкале) — не строкой и не безразмерными секундами. Скобки, унарный минус, переменные и константы, содержащие время, работают (focus time = 1 h 30 min, затем focus time + 15 min = 1 h 45 min), и длительности токенизируются, как другие величины.

Вывод использует естественную каноническую разбивку (недели, дни, часы, минуты, секунды; миллисекунды для субсекундного остатка), опускает нулевые компоненты, нормализует переносы и печатает один знак: 2 h 15 min, 1 day 3 h 30 min, 7 min 30 s, -30 min, 500 ms. Явная конвертация сбрасывает естественную форму к одноединичному результату: 1 h 30 min to min = 90 min, 1 h 30 min in hours = 1.5 h, 1 h 30 min as seconds = 5400 s.

Скорости и производные единицы никогда не становятся длительностью (90 km / 3 h = 30 km/h), и синтаксис дат сохраняет приоритет (May 5 + 2 days — дата). У длительностей нет управления нотацией или округлением для отдельного ответа.

Часы и laptime

Синтаксис часов проверяется до смешанных единиц и дат:

3:30pm + 2 hours 15 minutes  → 5:45 pm
3:30pm - 2 hours 15 minutes  → 1:15 pm
11:30pm + 45 min             → Tomorrow 12:15 am
now + 3 hours 25 minutes     → local wall time + 3 h 25 min
01:02:03 + 01:09:54          → 02:11:57        (elapsed time / laptime)
00:00:01.5 + 00:00:01        → 00:00:02.50
7:30am to 8:45pm             → 13 h 15 min     (interval forward)
4pm to 3am                   → 11 h
3:30pm as laptime            → 15:30:00

Принимаются формы h:mm, h:mm:ss, h am/pm и 4pm; AM/PM не зависит от регистра и может быть склеен или отделён пробелом. Минуты и секунды — 0…59, 12-часовой час — 1…12, 24-часовой — 0…23 (25:00 — строгая ошибка). Сложение и вычитание работают по настенным компонентам, поэтому переход DST не сдвигает запрошенные минуты, а перенос суток печатает Yesterday/Today/Tomorrow. clock + clock (3:30pm + 3:30pm) — строгая ошибка; голое h:mm:ss без AM/PM остаётся истекшим временем, а не моментом дня. Отображение следует региону: 12 часов для legacy/Северной Америки, 24 часа для Европы, цикл часов локали для System. Часовые строки исключены из Total, не имеют нотации и округления (только Copy/Delete) и не могут стать числовыми токенами.

Часовые пояса

time in Paris                 → current time in the zone
Tokyo time                    → same, "<place> time" form
date in Vancouver             → date in the zone
6pm Sydney in Chicago         → 3:00 am
2am PST to GMT                → 10:00 am
3pm GMT+8 to Paris            → 9:00 am
7:30am LAX to Japan           → 11:30 pm
time difference between Chicago and Paris → 7 h
difference between PDT & AEST → 17 h

Источник разрешается по полному офлайн-каталогу: IANA-идентификаторы и алиасы, города (с уточнением City, CC), названия стран, коды стран, коды IATA/ICAO, фиксированные аббревиатуры (EST/EDT/CST/CDT/MST/MDT/PST/PDT/AKST/AKDT/HST, AEST/AEDT/ACST/ACDT/AWST/ NZST/NZDT/BST/CET/CEST/EET/EEST/MSK/JST/KST/HKT/SGT) и GMT/UTC/GMT±H[:MM]. Настенное время источника привязывается к захваченной дате в его зоне, преобразуется в один абсолютный момент и отображается в целевой зоне, поэтому A → B → A сохраняет момент; реальные переходы DST учитываются, а несуществующее время в источнике — строгая ошибка. Неизвестное место в строке-часовом-поясе — строгая ошибка. Голое 6pm, даты и гео-строки обрабатываются по своим правилам. Пользовательские алиасы (Settings → Dates & Times) переопределяют только известные имена/IANA-идентификаторы и живут в приложении — никогда в .nlx.

Офлайн-каталог часовых поясов

Приложение несёт каталог часовых поясов (около 1 МБ): IANA-идентификаторы и алиасы, города с населением не менее 100 000, страна → столичная зона, IATA/ICAO → зона. Данные собраны из публичных источников (IANA tzdata, GeoNames, airportsdata) и используются полностью офлайн; сеть не требуется.

Таймстемпы и ISO 8601

Строгая полоса таймстемпов идёт до конвертаций единиц и обычного датового fallback:

current timestamp                    → 1,554,112,800   (number from captured now)
April 1, 2019 3:30pm as iso8601      → 2019-04-01T15:30:00+02:00
2019-04-01T15:30:00 to date          → Apr 1, 2019 3:30:00 pm
April 1, 2019 to timestamp           → 1,554,112,800
1559740303.48 to date                → Jun 5, 2019 3:11:43 pm
1733823083000 to date                → Dec 10, 2024 10:31:23 am

Секунды — Unix-время от 1970-01-01T00:00:00Z; конечные дробные значения допустимы. Значения от 1e12 и выше считаются миллисекундами (1733823083000 to date). Дата без времени для to timestamp привязывается к локальному полудню (DST-безопасно). Форма ISO принимает Z, ±HH:MM, опциональные секунды и дробную часть; явное смещение сохраняется как зона представления, иначе используется ваша локальная зона. Вывод ISO — yyyy-MM-dd'T'HH:mm:ssXXX; вывод date-time следует региональному 12/24-часовому стилю с фиксированным английским порядком (Apr 1, 2019 3:30 pm). Некорректные, несуществующие (DST-разрыв) и переполняющие значения — строгие ошибки. Датовые/ISO-строки исключены из Inline- и Footer-Total и из числовой цепочки Previous Answer; токены на них остаются безопасно неактивными.

Timespan

Нотация Timespan выбирается глобально (Numbers → Default answer format) или для отдельного ответа (Number Format в контекстном меню) и применяется только к величинам размерности времени; любое не-временное число падает в Automatic. Явный суффикс as timespan работает независимо от настройки:

5.5 minutes as timespan   → 5 min 30 s
4.54 hours as timespan    → 4 hours 32 minutes 24 seconds
72 days as timespan       → 10 weeks 2 days
3 hours 5 minutes 10 seconds → 3 h 5 min 10 s
3h 5m 10s in seconds      → 11,110 s

Форматтер жадно раскладывает по средним единицам yr = 365.2425 d и mo = 30.436875 d, затем по неделям, дням, часам, минутам, секундам и ms; печатает один знак после запятой, опускает нулевые компоненты и переносит округление в старший компонент. Средние yr/mo — только линейные факторы: календарная арифметика (+ 1 month) по-прежнему использует компоненты Calendar. Грамматика склеенных единиц: внутри уже доказанной цепочки длительности 3h 5m 10s буквы m и s означают минуты и секунды; одиночные 5m (5 000 000), 5 m (метры) и 10s не меняются. in seconds/in minutes/… сбрасывает к одиночной стандартной презентации. Та же типизированная грамматика обслуживает обычные строки, присваивания и выражения Answer Token.

Видео-таймкод и кадры

Строгая полоса таймкода идёт до часовой и смешанной полос:

03:10:20:05 at 30 fps + 50 frames        → 03:10:21:25
00:10:20:50 @ 60 fps + 10 minutes        → 00:20:20:50
00:30:10:00 @ 24 fps in frames           → 43,440 frames
43,440 frames @ 24 fps                   → 00:30:10:00
03:10:20:05 at 30 fps + 03:10:20:010     → 06:20:40:15
03:10:20:05 at 12 fps - 00:20:35:00      → 02:49:45:05
30 fps × 3 minutes                       → 5,400 frames
15.6k frames / 24 fps                    → 650 s

Кадры считаются точно (никогда через округлённые секунды): fps — целое от 1 до 1000, drop-frame синтаксиса нет. Внутри выражения таймкода fps означает кадры в секунду; вне него прежний скоростной алиас fps = ft/s сохраняется. FPS обязателен в любой операции; конфликт частот, отсутствие fps, выход за диапазон, переполнение счётчика кадров и битые коды — строгие ошибки. Поле кадров нормализует переносы и печатается минимум двумя цифрами (вход :010 принимается). Строки таймкода и кадров исключены из Total, округления и числовой цепочки Previous Answer; токены на них неактивны.

Рабочие календари и праздники

Рабочий день — понедельник–пятница минус государственные праздники выбранного региона. Диапазоны дат — start-exclusive/end-inclusive; отсутствующий год использует захваченный текущий. Неподдерживаемые регион или год — строгая ошибка, а не молчаливое игнорирование праздников.

workdays in 3 weeks                  → 15 workdays
10 March to 17 March in workdays     → 5 workdays
workdays from April 12 to June 15    → 44 workdays
$500/workday × 4 weeks               → $10,000.00
work hours in June                   → 6 day 16 h
work hours between March 12 and March 25 → 3 day
55h in work days                     → 6.875 workdays
December 24 + 2 workdays             → Dec 29

Алиасы: workday(s), work day(s), business day(s), weekday(s); запрос weekday on <date> и обычная проза не захватываются. Недатированные недели считают пять рабочих дней в неделю. Часы работы — типизированные длительности; денежная ставка за рабочий день сохраняет валютный вид; часы в рабочем дне берутся из настроек (1…24). Праздники — встроенный офлайн-каталог (25 стран, 2019–2035); сеть не используется, а регион или год вне каталога — ошибка.

Особые даты

Эти особые даты встроены:

Easter               → Apr 20        (captured current year)
Easter 2027          → Mar 28, 2027
Christmas            → Dec 25
days until Christmas → 344 days
days until Easter    → 95 days
Easter 2027 + 2 days → Mar 30, 2027

Пасха считается по григорианскому computus; ближайшее вхождение для days until берёт дату текущего года, если она ещё в будущем, иначе следующего. Неизвестное имя праздника (days until Festivus) — строгая ошибка, а проза со словами christmas/easter не захватывается. Рождество — всегда 25 декабря.

Зависимости от настроек

Дата и время вычисляются от одного захваченного now на лист, локального григорианского календаря и зоны и регионального стиля часов (12/24): legacy/Северная Америка — 12 часов, Западная/Восточная Европа — 24 часа, System следует циклу часов локали.

Сохраняемые настройки даты/времени:

  • Часы в рабочем дне (1…24, по умолчанию 8) — используются рабочего времени и конверсиями рабочих дней.
  • Регион праздников (по умолчанию automatic); рабочие дни пропускают государственные праздники этого региона, а неподдерживаемые регионы падают строго в датированных запросах рабочих дней.
  • Пользовательские часовые пояса, до 100, каждый с именем и IANA-идентификатором.

Эти настройки глобальны для приложения и никогда не попадают в экспорт .nlx или в лист.

Итоги, токены и ошибки

  • Строки часов, дат, таймстемпов/ISO и таймкода исключены из Inline- и Footer-Total, не имеют нотации и округления и не входят в числовую цепочку Previous Answer (токены на них остаются неактивными).
  • Длительности — настоящие типизированные величины: они распространяются через переменные, константы и токены и ведут себя как другие величины в выражениях.
  • Неизвестные места, неподдерживаемые регионы/годы рабочих дней, недействительные или несуществующие даты, недействительные часы, отсутствующий fps и переполняющие значения — строгие ошибки, а не угаданное число.

Связанные разделы

Нашли ошибку в документации? Сообщите о ней на GitHub