Hoe je een Chinese kalenderberekening controleert
Referentiedatums
Controleer de omzetting van datums in de maankalender, de tijdstippen van zonnetermen, almanakclassificaties en het gedrag van de interface afzonderlijk. Overeenstemming in één onderdeel bewijst niet dat de andere onderdelen juist zijn. Een bruikbare reeks controles omvat naast datums binnen een maand ook maand- en jaargrenzen.
Kies een onafhankelijke referentie met een vermelde kalenderconventie en dekking. Een tweede website met dezelfde rekenkern kan dezelfde fouten herhalen. Leg de editie of versie van de referentie vast naast de verwachte waarden, zodat een latere wijziging kan worden nagegaan.
De Atlas ondersteunt burgerlijke datums van 1 tot en met 2100 n.Chr. De vastgelegde versie van de rekenkern gebruikt juliaanse burgerlijke datums tot en met 1582-10-04, gevolgd door de gregoriaanse datum 1582-10-15. Van 5 oktober tot en met 14 oktober komen geen datums voor in die burgerlijke datumreeks. Een vergelijking met de gregoriaanse kalender die vóór zijn invoering naar het verleden is doorgetrokken, de proleptische gregoriaanse kalender, toetst voor eerdere datums een andere koppeling.
Deze conventie beschrijft de burgerlijke datumlabels van de software. Ze stelt niet vast welke kalender historisch in China werd gebruikt. Test de ondersteunde eindpunten en de verwerking van datums daarbuiten. Een bereik van burgerlijke datums verschilt ook van een bereik van volledige maanjaren, waarvan de grenzen op andere dagen vallen.
Sla elk resultaat op met de volledige burgerlijke datum en kalenderconventie, het maanjaar, het nummer van de maanmaand, de schrikkelvlag en de dag van de maanmaand. Onderscheid het maandnummer van de positie in het jaar: schrikkelmaand zes is chronologisch de zevende maand, maar het maandnummer blijft zes.
Testgevallen
Exacte datumcontroles
Deze datums omvatten Chinees Nieuwjaar, een geldige gregoriaanse schrikkeldag en beide uiteinden van gewone maanmaanden en schrikkelmaanden. In deze tabel is de maanjaaraanduiding het gregoriaanse jaar waarin dat maanjaar begint. “Gewoon” betekent dat de schrikkelvlag op false staat.
| Gregoriaanse datum | Maanjaar | Maand | Soort | Dag van de maanmaand |
|---|---|---|---|---|
| 2024-02-09 | 2023 | 12 | Gewoon | 30 |
| 2024-02-10 | 2024 | 1 | Gewoon | 1 |
| 2024-02-29 | 2024 | 1 | Gewoon | 20 |
| 2025-07-24 | 2025 | 6 | Gewoon | 30 |
| 2025-07-25 | 2025 | 6 | Schrikkelmaand | 1 |
| 2025-08-22 | 2025 | 6 | Schrikkelmaand | 29 |
| 2025-08-23 | 2025 | 7 | Gewoon | 1 |
| 2033-12-21 | 2033 | 11 | Gewoon | 30 |
| 2033-12-22 | 2033 | 11 | Schrikkelmaand | 1 |
| 2034-01-19 | 2033 | 11 | Schrikkelmaand | 29 |
| 2034-01-20 | 2033 | 12 | Gewoon | 1 |
| 2034-02-19 | 2034 | 1 | Gewoon | 1 |
Voer elke datum in beide richtingen door de omzetting. Omzetting van gregoriaans naar de maankalender moet alle vier de maankalendervelden opleveren, en omzetting terug naar gregoriaans moet de vermelde datum herstellen. Test daarna de hele reeks rond de grens, niet alleen de eerste dag. Zo wordt een verkeerd maandbegin onderscheiden van een weergavelabel dat de schrikkelvlag weglaat.
Een heen-en-terugomzetting alleen kan de juistheid niet vaststellen. Twee functies kunnen dezelfde foutieve tabel gebruiken en elkaar toch perfect ongedaan maken. Vergelijken met onafhankelijke verwachte waarden is een afzonderlijke controle. Een uitputtende vergelijking moet vastleggen hoeveel datums zijn vergeleken, welke referentie is gebruikt en welke verschillen er zijn gevonden.
Structuur- en invoercontroles
| Controle | Verwacht gedrag |
|---|---|
| Verdergaan vanaf de laatste dag van een maanmaand | Dag één van de chronologisch volgende maand, met het juiste maandnummer, de juiste schrikkelvlag en het juiste maanjaar |
| Verdergaan van een gewone maand naar haar schrikkelmaand | Het maandnummer herhalen en de schrikkelvlag op true zetten |
| Verdergaan van een schrikkelmaand naar de volgende maand | De schrikkelvlag wissen en het maandnummer verhogen, met zo nodig de overgang naar een nieuw jaar |
| Dag 30 opvragen van de 29 dagen lange schrikkelmaand zes in 2025 | De niet-bestaande datum in de maankalender afwijzen |
| Een schrikkelmaand opvragen in een jaar waarin die schrikkelmaand niet voorkomt | Deze afwijzen in plaats van de gewone maand ervoor in de plaats te zetten |
| Eerst 29 februari 2000 invoeren en daarna 29 februari 2100 | De eerste gregoriaanse datum accepteren en de tweede afwijzen |
| 29 februari 1500 invoeren volgens de juliaanse conventie van de Atlas | Deze accepteren als geldige juliaanse datum |
| Eén burgerlijke dag verdergaan vanaf 1582-10-04 volgens de overgangsconventie van de Atlas | Uitkomen op 1582-10-15, precies één verstreken dag later |
| Een geldige datum naar de maankalender omzetten en terug | De oorspronkelijke datum herstellen zonder de identiteit van de schrikkelmaand te verliezen |
De juliaanse kalender voegt elk vierde jaar een schrikkeldag toe. De gregoriaanse regel sluit eeuwjaren uit, tenzij ze deelbaar zijn door 400. Daarom moet bij een schrikkeldagtest worden aangegeven welke burgerlijke kalender wordt gebruikt.
De afwijzingscontroles beschrijven een interface met strikte datuminvoer. Een onderliggende bibliotheek kan ook gedocumenteerde normalisatie aanbieden, zoals het doorschuiven van een dag buiten het geldige bereik naar de volgende maand. Test deze gedragingen afzonderlijk, in plaats van een genormaliseerde waarde voor de oorspronkelijke invoer aan te zien.
Interfacecontroles
Test het wisselen van taal, het vernieuwen van de browserpagina, de maandnavigatie en de Almanakvermelding afzonderlijk van de omzettingsfuncties. Bij een taalwisseling moeten de geselecteerde datum en de weergegeven maand behouden blijven. Bij het doorbladeren van een andere maand moet de geselecteerde dag behouden blijven totdat een nieuwe dag wordt gekozen. Controleer of de Almanakvermelding de lokale gregoriaanse datum van het apparaat opent en of een permanente datumpagina in een andere tijdzone de erop geschreven burgerlijke datum behoudt.
Neem een testmoment op waarop de lokale datum van het apparaat verschilt van de referentiedatum van de kalender. Dit spoort de fout op waarbij de astronomische referentieklok wordt gebruikt om de datum van de Almanak te kiezen, of de browserklok om de grenzen van de maanmaanden te reconstrueren.
Zonnetermen en grenzen
Voor een vergelijking van zonnetermen zijn de identiteit van de term, de burgerlijke datum, de tijd, de tijdstandaard en de gepubliceerde precisie nodig. Zet beide waarden in dezelfde burgerlijke kalender en tijdstandaard voordat je ze vergelijkt. Een tijd die tot op de minuut is gepubliceerd, kan geen overeenkomst tot op de seconde aantonen.
Test de toegewezen kalenderdatum afzonderlijk van de toegestane afwijking in het tijdstip. Een verschil van minder dan een minuut kan aanvaardbaar zijn voor een afgeronde weergave en een gebeurtenis toch aan de verkeerde kant van middernacht plaatsen. Leg bekende onzekerheid voor die specifieke grens vast in plaats van de toegestane afwijking voor alle datums te vergroten.
Neem een nieuwe maan en een hoofdterm op die op dezelfde referentiedatum plaatsvinden. De term hoort bij de nieuwe kalendermaand, ook als het moment ervan vóór de conjunctie valt. Een test die alleen op de volgorde van gebeurtenistijdstippen is gebaseerd, kan dit onderscheid missen.
Neem voor de nummering van schrikkelmaanden de reeks van 2033–2034 op. De gewone maand acht van 2033 en maand één van 2034 hebben geen hoofdterm, terwijl de tussenliggende schrikkelmaand elf is. Een berekening die elke maand zonder hoofdterm als schrikkelmaand behandelt, slaagt niet voor deze controles.
Almanakcontroles en historische controles
Almanakclassificaties
Yi betekent geschikte activiteiten en Ji betekent te vermijden activiteiten. Overeenstemming over een nieuwe maan of een datum in de maankalender bevestigt de juistheid van deze lijsten niet. Test hun opzoekregels aan de hand van de gekozen almanakconventie of gegevensverzameling en controleer daarna de Nederlandse activiteitenlabels afzonderlijk. Een expliciete uitkomst “geen” moet ook te onderscheiden blijven van ontbrekende gegevens.
Wanneer een almanakclassificatie bij een zonneterm verandert, leg dan vast of de grens het begin van de kalenderdag van die term is of het exacte moment van de term. Test beide kanten van de gekozen grens. Deze maandclassificaties hoeven niet bij het begin van een maanmaand te veranderen.
Ook voor Ganzhi, de stam-takcyclus, is een vastgelegde jaargrens nodig. Een jaaraanduiding op basis van Chinees Nieuwjaar kan in het interval tussen de twee grenzen verschillen van een aanduiding op basis van Begin van de lente, ofwel Lichun. Vergelijk elk veld volgens de erbij vermelde conventie.
Historische omzetting
Bepaal voor een historisch document de dynastie of het tijdperkjaar, de plaats, de maandaanduiding, de schrikkelaanduiding en een eventuele vermelde Ganzhi-dag voordat je een omzettingsmethode kiest. Oudere kalenders gebruikten andere astronomische methoden en tijdconventies. Een moderne berekening die naar het verleden is doorgetrokken, kan daardoor afwijken van de kalender die daadwerkelijk voor het document is gebruikt.
Houd de transcriptie, de interpretatie en de omgezette datum als afzonderlijke velden bij. Wanneer een document zowel een genummerde datum als een Ganzhi-dag geeft, toets dan of ze overeenstemmen, in plaats van de ene te schrappen om de andere passend te maken.