Как проверить расчёт китайского календаря
Контрольные даты
Проверяйте отдельно перевод лунных дат, время наступления солнечных сезонов, классификации альманаха и поведение интерфейса. Совпадение в одной части не доказывает правильности остальных. Полезный набор проверок включает границы месяцев и лет, а также даты внутри месяца.
Выберите независимый источник с указанными календарными правилами и охватом. Второй сайт, использующий тот же расчётный механизм, может воспроизводить те же ошибки. Записывайте издание или версию источника рядом с ожидаемыми значениями, чтобы позднейшее изменение можно было проследить.
Атлас поддерживает даты гражданского календаря с 1 по 2100 год н. э. Его закреплённая версия расчётного механизма использует юлианские даты до 1582-10-04 включительно, после чего следует григорианская дата 1582-10-15. Дат с 5 по 14 октября в этой последовательности гражданского календаря нет. Сравнение с григорианским календарём, распространённым назад до его введения, — пролептическим григорианским календарём — проверяет другое соответствие для ранних дат.
Это правило описывает обозначения дат гражданского календаря в программе. Оно не устанавливает, какой календарь исторически использовался в Китае. Проверьте поддерживаемые конечные точки и обработку дат за их пределами. Диапазон гражданских дат также отличается от диапазона полных лунных лет, границы которых приходятся на другие дни.
Сохраняйте каждый результат как полную запись: дата гражданского календаря и его правила, лунный год, номер лунного месяца, признак вставного месяца и лунный день. Отличайте номер месяца от его места в году: вставной шестой месяц — седьмой в хронологическом порядке, но его номер остаётся шестым.
Проверочные случаи
Проверки точных дат
Эти даты охватывают китайский Новый год, допустимый григорианский високосный день и оба конца обычных и вставных лунных месяцев. В этой таблице обозначением лунного года служит григорианский год, в котором он начинается. «Обычный» означает, что признак вставного месяца имеет значение «ложь».
| Григорианская дата | Лунный год | Месяц | Тип | Лунный день |
|---|---|---|---|---|
| 2024-02-09 | 2023 | 12 | Обычный | 30 |
| 2024-02-10 | 2024 | 1 | Обычный | 1 |
| 2024-02-29 | 2024 | 1 | Обычный | 20 |
| 2025-07-24 | 2025 | 6 | Обычный | 30 |
| 2025-07-25 | 2025 | 6 | Вставной | 1 |
| 2025-08-22 | 2025 | 6 | Вставной | 29 |
| 2025-08-23 | 2025 | 7 | Обычный | 1 |
| 2033-12-21 | 2033 | 11 | Обычный | 30 |
| 2033-12-22 | 2033 | 11 | Вставной | 1 |
| 2034-01-19 | 2033 | 11 | Вставной | 29 |
| 2034-01-20 | 2033 | 12 | Обычный | 1 |
| 2034-02-19 | 2034 | 1 | Обычный | 1 |
Проверьте каждую дату в обоих направлениях. Перевод из григорианского календаря в лунный должен дать все четыре лунных поля, а обратный перевод — восстановить указанную дату. Затем проверьте всю последовательность вокруг границы, а не только её первый день. Это позволяет отличить неверное начало месяца от подписи, в которой потеряна отметка о вставке.
Одного перевода туда и обратно недостаточно для установления точности. Две функции могут использовать одну неверную таблицу и всё же безупречно отменять действие друг друга. Сравнение с независимыми ожидаемыми значениями — отдельная проверка. При исчерпывающем сравнении нужно записывать число сопоставленных дат, использованный источник и каждое несовпадение.
Проверки структуры и ввода
| Проверка | Ожидаемое поведение |
|---|---|
| Перейти с последнего дня лунного месяца на следующий день | Первый день следующего по времени месяца с правильными номером месяца, признаком вставки и лунным годом |
| Перейти из обычного месяца в следующий за ним вставной | Повторить номер месяца и установить признак вставки в значение «истина» |
| Перейти из вставного месяца в следующий | Снять признак вставки и увеличить номер месяца, включая переход года, если он необходим |
| Запросить день 30 в 29-дневном вставном шестом месяце 2025 года | Отклонить несуществующую лунную дату |
| Запросить вставной месяц в году, где его нет | Отклонить запрос, а не подставить обычный месяц |
| Ввести 29 февраля 2000 года, затем 29 февраля 2100 года | Принять первую григорианскую дату и отклонить вторую |
| Ввести 29 февраля 1500 года по юлианскому правилу Атласа | Принять как допустимую юлианскую дату |
| Перейти на один день гражданского календаря вперёд от 1582-10-04 по правилу перехода Атласа | Получить 1582-10-15, ровно через один прошедший день |
| Перевести допустимую дату в лунную и обратно | Восстановить исходную дату, не потеряв принадлежность к вставному месяцу |
Юлианский календарь добавляет високосный день каждый четвёртый год. Григорианское правило исключает вековые годы, если они не делятся на 400, поэтому проверка високосного дня должна указывать гражданский календарь.
Проверки отклонения описывают строгий интерфейс ввода дат. Лежащая в основе библиотека может также предлагать документированную нормализацию, например перенос дня за пределами допустимого диапазона в следующий месяц. Проверяйте эти варианты поведения отдельно, не принимая нормализованное значение за первоначальный ввод.
Проверки интерфейса
Проверяйте переключение языка, обновление браузера, переходы между месяцами и запись «Альманах» отдельно от функций перевода дат. Смена языка должна сохранять выбранную дату и показанный месяц. Просмотр другого месяца должен сохранять выбранный день, пока не выбран новый. Проверьте, что запись «Альманах» открывает местную григорианскую дату устройства, а постоянная страница даты сохраняет написанную дату гражданского календаря в другом часовом поясе.
Включите в тесты момент, когда местная дата устройства отличается от опорной даты календаря. Это выявляет ошибочное использование астрономических опорных часов для выбора даты записи «Альманах» или часов браузера для восстановления границ лунных месяцев.
Солнечные сезоны и границы
Для сравнения солнечных сезонов необходимы название сезона, дата гражданского календаря, время, стандарт времени и точность публикации. Прежде чем сравнивать значения, приведите их к одному гражданскому календарю и одному стандарту времени. Время, опубликованное с точностью до минуты, не может подтвердить совпадение до секунды.
Проверяйте назначенную календарную дату отдельно от допустимой погрешности временной отметки. Разница менее минуты может быть приемлемой для округлённого отображения, но поместить событие по другую сторону полуночи. Документируйте известную неопределённость для конкретной границы, а не расширяйте допуск для всех дат.
Включите новолуние и главный солнечный сезон, приходящиеся на одну опорную дату. Сезон относится к новому календарному месяцу, даже если его момент предшествует соединению. Проверка только по порядку временных отметок событий может упустить это различие.
Для нумерации вставных месяцев включите последовательность 2033–2034 годов. Обычный восьмой месяц 2033 года и первый месяц 2034 года не содержат главного солнечного сезона, а расположенный между ними вставной месяц — одиннадцатый. Расчёт, который считает вставным любой месяц без главного сезона, не пройдёт эти проверки.
Проверки альманаха и исторических дат
Классификации альманаха
И означает подходящие занятия, а цзи — занятия, которых следует избегать. Совпадение новолуния или лунной даты не подтверждает правильность этих списков. Проверьте правила поиска по выбранной традиции альманаха или набору данных, а затем отдельно проверьте английские обозначения занятий. Явный результат «нет» также должен оставаться отличимым от отсутствующих данных.
Если классификация альманаха меняется при наступлении солнечного сезона, запишите, проходит ли её граница в начале календарного дня сезона или в точный момент его наступления. Проверьте обе стороны выбранной границы. Эти месячные классификации не обязаны меняться в начале лунного месяца.
Ганьчжи, цикл стволов и ветвей, также требует объявленной границы года. Обозначение года по китайскому Новому году и обозначение по Началу весны, или Личунь, могут различаться в промежутке между этими границами. Сравнивайте каждое поле по указанному для него правилу.
Перевод исторических дат
Для исторического документа установите династию или год эры, место, обозначение месяца, отметку о вставке и записанный день ганьчжи, если он есть, прежде чем выбирать метод перевода. Более ранние календари использовали другие астрономические методы и правила отсчёта времени. Поэтому современный расчёт, распространённый назад, может отличаться от календаря, фактически использованного в записи.
Храните транскрипцию, её толкование и переведённую дату в отдельных полях. Если документ содержит и числовую дату, и день ганьчжи, проверяйте их согласованность, а не отбрасывайте одно, чтобы подогнать другое.