Какую дату стоит протестировать?
Половина тестирования дат — сдвинуть часы. Вторая половина — знать, куда их сдвигать. Онлайн-калькулятор скажет, какое число будет через девяносто дней от сегодня. Он не скажет, что это банковский выходной или последний день квартала.
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 выдаёт тот же результат в машинном виде.
Даты, которые стоит тестировать →