Chrono Mock
ЯзыкРусский

Какую дату стоит протестировать?

Половина тестирования дат — сдвинуть часы. Вторая половина — знать, куда их сдвигать. Онлайн-калькулятор скажет, какое число будет через девяносто дней от сегодня. Он не скажет, что это банковский выходной или последний день квартала.

Калькулятор Chrono Mock. Слева идёт список сценариев с поиском и их пояснениями, посередине — конструктор даты, а колонка результатов справа перечисляет все форматы с кнопкой копирования у каждого и Use this date под ними. Под конструктором вставленная дата 04/08/2008 помечена как неоднозначная, с показом и американского, и польского прочтения.
Под конструктором — обратное направление: вставлено 04/08/2008, и показаны оба прочтения, а не одно угаданное.

Рабочие дни с настоящими праздниками

«Через десять рабочих дней» — это не арифметика: всё зависит от того, по календарю какой страны вы считаете. Та же начальная дата, те же десять дней, два разных ответа:

$ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar us-banking
  result:  2027-09-16T00:00:00

$ chrono calc --base 2027-09-01T00:00:00 --shift +10bd --calendar pl
  result:  2027-09-15T00:00:00

Разница в один день, и калькулятор объяснит почему, если спросить его о дате посередине:

$ chrono calc --base 2027-09-06T00:00:00 --calendar us-banking
  metadata:
    weekday       Monday
    business day  no  (us-banking)
    holiday       Labor Day
  what this date lands on:
    public holiday
    (weekend and holiday marks follow the us-banking calendar)

Соединённые Штаты и Польша поставляются как эталонные календари, выбранные потому, что вместе они задействуют все существующие типы правил: фиксированные даты, n-й день недели месяца, даты, вычисляемые от Пасхи, и американское правило, по которому праздник, выпавший на субботу, отмечается в предыдущую пятницу. Добавление страны — это файл данных, а не изменение кода.

Все форматы сразу

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

$ chrono calc --preset year-2038 --zone +00:00
Chrono Mock - date calculator
  preset:   year-2038 - 2038 boundary
  explains: Does the app survive the 32-bit Unix time boundary (2038-01-19T03:14:07Z)?
  result:  2038-01-19T03:14:07
  formats:
    ISO date      2038-01-19
    ISO datetime  2038-01-19T03:14:07+00:00
    US            01/19/2038
    PL            19.01.2038
    epoch (s)     2147483647
    epoch (ms)    2147483647000
    FILETIME      137919572470000000
    RFC 1123      Tue, 19 Jan 2038 03:14:07 GMT
  ...
  what this date lands on:
    at or past the 2038-01-19T03:14:07Z 32-bit time_t limit (Y2038)

Это значение epoch — не совпадение: 2147483647 — это в точности наибольшее число, которое вмещает знаковое 32-разрядное целое, и вся причина, по которой эта дата важна.

Чтение даты в обратную сторону

Обратное направление не менее полезно: вставьте дату из лога и узнайте, что это такое. Когда формат неоднозначен — а 04/08 неоднозначно в половине мира, — показываются оба прочтения, а не угадывается одно, потому что именно из угадывания родился исходный отчёт об ошибке.

$ chrono calc --analyze 04/08/2027
Chrono Mock - date analysis
  input:   04/08/2027  (ambiguous - month/day order differs by locale)
  US MM/DD/YYYY:  2027-04-08  (Thursday)
  PL DD/MM/YYYY:  2027-08-04  (Wednesday)

Разница в четыре месяца, и дни недели разные. Дата в формате ISO однозначна и читается как есть, а то, что вообще не является датой, отклоняется, а не угадывается.

Строится из шагов, а не из фразы

Момент — это отправная точка плюс шаги, и промежуточный результат показывается после каждого, так что выражение, давшее неожиданный ответ, показывает, где оно свернуло не туда. Пять видов шагов: сдвиг на единицу, установка времени суток, скачок на границу периода, переход к ближайшему рабочему дню и переписывание в другом часовом поясе.

# Последняя секунда перед сменой года
chrono calc --base today --snap eoy

# Девяносто рабочих дней вперёд по американскому банковскому календарю
chrono calc --base today --shift +90bd --calendar us-banking

# Восемнадцать лет и день назад — проверка возраста
chrono calc --base today --shift -18y --shift -1d

Любая вычисленная дата сразу идёт в сессию подмены, а --json выдаёт тот же результат в машинном виде. Даты, которые стоит тестировать →

Попробуйте