Как проверить расчёт китайского календаря

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

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

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

Атлас поддерживает даты гражданского календаря с 1 по 2100 год н. э. Его закреплённая версия расчётного механизма использует юлианские даты до 1582-10-04 включительно, после чего следует григорианская дата 1582-10-15. Дат с 5 по 14 октября в этой последовательности гражданского календаря нет. Сравнение с григорианским календарём, распространённым назад до его введения, — пролептическим григорианским календарём — проверяет другое соответствие для ранних дат.

Это правило описывает обозначения дат гражданского календаря в программе. Оно не устанавливает, какой календарь исторически использовался в Китае. Проверьте поддерживаемые конечные точки и обработку дат за их пределами. Диапазон гражданских дат также отличается от диапазона полных лунных лет, границы которых приходятся на другие дни.

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

Проверочные случаи

Проверки точных дат

Эти даты охватывают китайский Новый год, допустимый григорианский високосный день и оба конца обычных и вставных лунных месяцев. В этой таблице обозначением лунного года служит григорианский год, в котором он начинается. «Обычный» означает, что признак вставного месяца имеет значение «ложь».

Григорианская датаЛунный годМесяцТипЛунный день
2024-02-09202312Обычный30
2024-02-1020241Обычный1
2024-02-2920241Обычный20
2025-07-2420256Обычный30
2025-07-2520256Вставной1
2025-08-2220256Вставной29
2025-08-2320257Обычный1
2033-12-21203311Обычный30
2033-12-22203311Вставной1
2034-01-19203311Вставной29
2034-01-20203312Обычный1
2034-02-1920341Обычный1

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

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

Проверки структуры и ввода

ПроверкаОжидаемое поведение
Перейти с последнего дня лунного месяца на следующий деньПервый день следующего по времени месяца с правильными номером месяца, признаком вставки и лунным годом
Перейти из обычного месяца в следующий за ним вставнойПовторить номер месяца и установить признак вставки в значение «истина»
Перейти из вставного месяца в следующийСнять признак вставки и увеличить номер месяца, включая переход года, если он необходим
Запросить день 30 в 29-дневном вставном шестом месяце 2025 годаОтклонить несуществующую лунную дату
Запросить вставной месяц в году, где его нетОтклонить запрос, а не подставить обычный месяц
Ввести 29 февраля 2000 года, затем 29 февраля 2100 годаПринять первую григорианскую дату и отклонить вторую
Ввести 29 февраля 1500 года по юлианскому правилу АтласаПринять как допустимую юлианскую дату
Перейти на один день гражданского календаря вперёд от 1582-10-04 по правилу перехода АтласаПолучить 1582-10-15, ровно через один прошедший день
Перевести допустимую дату в лунную и обратноВосстановить исходную дату, не потеряв принадлежность к вставному месяцу

Юлианский календарь добавляет високосный день каждый четвёртый год. Григорианское правило исключает вековые годы, если они не делятся на 400, поэтому проверка високосного дня должна указывать гражданский календарь.

Проверки отклонения описывают строгий интерфейс ввода дат. Лежащая в основе библиотека может также предлагать документированную нормализацию, например перенос дня за пределами допустимого диапазона в следующий месяц. Проверяйте эти варианты поведения отдельно, не принимая нормализованное значение за первоначальный ввод.

Проверки интерфейса

Проверяйте переключение языка, обновление браузера, переходы между месяцами и запись «Альманах» отдельно от функций перевода дат. Смена языка должна сохранять выбранную дату и показанный месяц. Просмотр другого месяца должен сохранять выбранный день, пока не выбран новый. Проверьте, что запись «Альманах» открывает местную григорианскую дату устройства, а постоянная страница даты сохраняет написанную дату гражданского календаря в другом часовом поясе.

Включите в тесты момент, когда местная дата устройства отличается от опорной даты календаря. Это выявляет ошибочное использование астрономических опорных часов для выбора даты записи «Альманах» или часов браузера для восстановления границ лунных месяцев.

Солнечные сезоны и границы

Для сравнения солнечных сезонов необходимы название сезона, дата гражданского календаря, время, стандарт времени и точность публикации. Прежде чем сравнивать значения, приведите их к одному гражданскому календарю и одному стандарту времени. Время, опубликованное с точностью до минуты, не может подтвердить совпадение до секунды.

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

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

Для нумерации вставных месяцев включите последовательность 2033–2034 годов. Обычный восьмой месяц 2033 года и первый месяц 2034 года не содержат главного солнечного сезона, а расположенный между ними вставной месяц — одиннадцатый. Расчёт, который считает вставным любой месяц без главного сезона, не пройдёт эти проверки.

Проверки альманаха и исторических дат

Классификации альманаха

И означает подходящие занятия, а цзи — занятия, которых следует избегать. Совпадение новолуния или лунной даты не подтверждает правильность этих списков. Проверьте правила поиска по выбранной традиции альманаха или набору данных, а затем отдельно проверьте английские обозначения занятий. Явный результат «нет» также должен оставаться отличимым от отсутствующих данных.

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

Ганьчжи, цикл стволов и ветвей, также требует объявленной границы года. Обозначение года по китайскому Новому году и обозначение по Началу весны, или Личунь, могут различаться в промежутке между этими границами. Сравнивайте каждое поле по указанному для него правилу.

Перевод исторических дат

Для исторического документа установите династию или год эры, место, обозначение месяца, отметку о вставке и записанный день ганьчжи, если он есть, прежде чем выбирать метод перевода. Более ранние календари использовали другие астрономические методы и правила отсчёта времени. Поэтому современный расчёт, распространённый назад, может отличаться от календаря, фактически использованного в записи.

Храните транскрипцию, её толкование и переведённую дату в отдельных полях. Если документ содержит и числовую дату, и день ганьчжи, проверяйте их согласованность, а не отбрасывайте одно, чтобы подогнать другое.

1–2100 годы н. э.

Политика конфиденциальности