Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-18 66d68b6462bfd492db15535559c0c25b0f16eebc
commit | author | age
66d68b 1 /*
U 2   Zeitrechnung - a class library to determine calendar events
3   Copyright (c) 1984-2023 Ulrich Hilger, http://uhilger.de
4
5   This program is free software: you can redistribute it and/or modify
6   it under the terms of the GNU Affero General Public License as published by
7   the Free Software Foundation, either version 3 of the License, or
8   (at your option) any later version.
9
10   This program is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU Affero General Public License for more details.
14
15   You should have received a copy of the GNU Affero General Public License
16   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  */
18 package de.uhilger.zeitrechnung.kalender;
19
20 import de.uhilger.zeitrechnung.Datum;
21 import de.uhilger.zeitrechnung.Definition;
22
23 /**
24  * Die Klasse JulianischerKalender dient zur Umwandlung von generischem 
25  * Datum zu julianischem Datum und umgekehrt.
26  * 
27  * <p>
28  * Diese Klasse modelliert das Julianische Kalendersystem. Das hiermit  
29  * berechnete generische Datum ist nicht das Julianische Datum, wie es in 
30  * der Astronomie verwendet wird .
31  * </p>
32  * 
33  * @author Ulrich Hilger
34  */
35 public class JulianischerKalender extends BasisKalender implements Wandler {
36   
37     /** Starttag des julianischen Kalenders */
38     public static final long STARTTAG = 
39           new ISOKalender().zuTagen(0, Definition.DEZEMBER, 30);
40
41   /* ------- Schnittstelle Wandler -------------- */
42   
43   /**
44    * Ein Datum im julianischen Kalender zu einem generischen Datum wandeln
45    * 
46    * @param jahr das Jahr im julianischen Kalender, 
47    *    negative Zahlen entsprechen 'v. Chr.' bzw. 'vor unserer Zeit / v.u.Z.' 
48    *    oder engl. before common era / BCE,
49    * @param monat der Monat im julianischen Kalender
50    * @param tag der Tag im julinaischen Kalender
51    * @return das generische Datum
52    */
53   @Override
54   public long zuTagen(long jahr, int monat, int tag) {
55         long y = jahr < 0 ? jahr + 1 : jahr;
56         return STARTTAG - 1
57             + 365 * (y - 1)
58             + ganzzahlQuotient(y - 1, 4)
59             + ganzzahlQuotient(367 * monat - 362, 12)
60             + (monat <= 2 ? 0 :
61                 (schaltjahr(jahr) ? -1 : -2))
62             + tag;
63   }
64
65   /**
66    * Ein Datum im julianischen Kalender zu einem generischen Datum wandeln
67    * 
68    * @param d das Datum im julianischen Kalender
69    * @return das generische Datum
70    */
71   @Override
72   public long zuTagen(Datum d) {
73     return zuTagen(d.getJahr(), d.getMonat(), d.getTag());
74   }
75
76   /**
77    * Das julianische Datum aus einem generischen Datum bestimmen 
78    * 
79    * @param tage das generische Datum
80    * @return  das julianische Datum
81    */
82   @Override
83   public Datum vonTagen(long tage) {
84         long approx = ganzzahlQuotient(4 * (tage - STARTTAG) + 1464, 1461);
85     long jahr = approx <= 0 ? approx - 1 : approx;
86         long tageDavor = tage - zuTagen(jahr, Definition.JANUAR, 1);
87         int korrektur = tage < zuTagen(jahr, Definition.MAERZ, 1) ? 0 : (schaltjahr(jahr) ? 1 : 2);
88         int monat = (int)ganzzahlQuotient(12 * (tageDavor + korrektur) + 373, 367);
89         int tag = (int)(tage - zuTagen(jahr, monat, 1) + 1);
90     return new Datum(jahr, monat, tag);
91   }
92   
93   /* ------------ Besonderheiten des Julianischen Kalenders ---------- */
94   
95   /**
96    * Julianisches Schaltjahr
97    * @param jYear julianisches Jahr
98    * @return true, wenn Schaltjahr, false wenn nicht
99    */
100     public boolean schaltjahr(long jYear) {
101         return modulo(jYear, 4) == (jYear > 0 ? 0 : 3);
102     }
103       
104     /*- bce -*/
105
106     // TYPE standard-year -> julian-year
107     // Negative value to indicate a BCE Julian year.
108
109     public long BCE(long n) {
110         return -n;
111     }
112
113
114     /*- ce -*/
115
116     // TYPE standard-year -> julian-year
117     // Positive value to indicate a CE Julian year.
118     
119     public long CE(long n) {
120         return n;
121     }
122
123 }