/*
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
* 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 { /** * Als Starttag wird der 1. Jaunuar 1 im julianischen Kalender festgelegt. * 1. Januar 1 (jul) entspricht dem 30. Dezember 0 (greg). */ 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); } public long BCE(long n) { return -n; } public long CE(long n) { return n; } }