/* Zeitrechnung - a class library to determine calendar events Copyright (c) 1984-2023 Ulrich Hilger, http://uhilger.de This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.uhilger.zeitrechnung.kalender; import de.uhilger.zeitrechnung.Datum; import de.uhilger.zeitrechnung.Definition; /** * Die Klasse JulianischerKalender dient zur Umwandlung von generischem * Datum zu julianischem Datum und umgekehrt. * *

* Diese Klasse modelliert das Julianische Kalendersystem. Das hiermit * berechnete generische Datum ist nicht das Julianische Datum, wie es in * der Astronomie verwendet wird . *

* * @author Ulrich Hilger */ public class JulianischerKalender extends BasisKalender implements Wandler { /** Starttag des julianischen Kalenders */ public static final long STARTTAG = new ISOKalender().zuTagen(0, Definition.DEZEMBER, 30); /* ------- Schnittstelle Wandler -------------- */ /** * Ein Datum im julianischen Kalender zu einem generischen Datum wandeln * * @param jahr das Jahr im julianischen Kalender, * negative Zahlen entsprechen 'v. Chr.' bzw. 'vor unserer Zeit / v.u.Z.' * oder engl. before common era / BCE, * @param monat der Monat im julianischen Kalender * @param tag der Tag im julinaischen Kalender * @return das generische Datum */ @Override public long zuTagen(long jahr, int monat, int tag) { long y = jahr < 0 ? jahr + 1 : jahr; return STARTTAG - 1 + 365 * (y - 1) + ganzzahlQuotient(y - 1, 4) + ganzzahlQuotient(367 * monat - 362, 12) + (monat <= 2 ? 0 : (schaltjahr(jahr) ? -1 : -2)) + tag; } /** * Ein Datum im julianischen Kalender zu einem generischen Datum wandeln * * @param d das Datum im julianischen Kalender * @return das generische Datum */ @Override public long zuTagen(Datum d) { return zuTagen(d.getJahr(), d.getMonat(), d.getTag()); } /** * Das julianische Datum aus einem generischen Datum bestimmen * * @param tage das generische Datum * @return das julianische Datum */ @Override public Datum vonTagen(long tage) { long approx = ganzzahlQuotient(4 * (tage - STARTTAG) + 1464, 1461); long jahr = approx <= 0 ? approx - 1 : approx; long tageDavor = tage - zuTagen(jahr, Definition.JANUAR, 1); int korrektur = tage < zuTagen(jahr, Definition.MAERZ, 1) ? 0 : (schaltjahr(jahr) ? 1 : 2); int monat = (int)ganzzahlQuotient(12 * (tageDavor + korrektur) + 373, 367); int tag = (int)(tage - zuTagen(jahr, monat, 1) + 1); return new Datum(jahr, monat, tag); } /* ------------ Besonderheiten des Julianischen Kalenders ---------- */ /** * Julianisches Schaltjahr * @param jYear julianisches Jahr * @return true, wenn Schaltjahr, false wenn nicht */ public boolean schaltjahr(long jYear) { return modulo(jYear, 4) == (jYear > 0 ? 0 : 3); } /*- bce -*/ // TYPE standard-year -> julian-year // Negative value to indicate a BCE Julian year. public long BCE(long n) { return -n; } /*- ce -*/ // TYPE standard-year -> julian-year // Positive value to indicate a CE Julian year. public long CE(long n) { return n; } }