Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-19 8cf8493e4b918cece529fef978d50c8b9835d230
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   
9ada05 37     /** 
U 38    * Als Starttag wird der 1. Jaunuar 1 im julianischen Kalender festgelegt.
39    * 1. Januar 1 (jul) entspricht dem 30. Dezember 0 (greg). 
40    */
66d68b 41     public static final long STARTTAG = 
U 42           new ISOKalender().zuTagen(0, Definition.DEZEMBER, 30);
43
44   /* ------- Schnittstelle Wandler -------------- */
45   
46   /**
47    * Ein Datum im julianischen Kalender zu einem generischen Datum wandeln
48    * 
49    * @param jahr das Jahr im julianischen Kalender, 
50    *    negative Zahlen entsprechen 'v. Chr.' bzw. 'vor unserer Zeit / v.u.Z.' 
51    *    oder engl. before common era / BCE,
52    * @param monat der Monat im julianischen Kalender
53    * @param tag der Tag im julinaischen Kalender
54    * @return das generische Datum
55    */
56   @Override
57   public long zuTagen(long jahr, int monat, int tag) {
58         long y = jahr < 0 ? jahr + 1 : jahr;
59         return STARTTAG - 1
60             + 365 * (y - 1)
61             + ganzzahlQuotient(y - 1, 4)
62             + ganzzahlQuotient(367 * monat - 362, 12)
63             + (monat <= 2 ? 0 :
64                 (schaltjahr(jahr) ? -1 : -2))
65             + tag;
66   }
67
68   /**
69    * Ein Datum im julianischen Kalender zu einem generischen Datum wandeln
70    * 
71    * @param d das Datum im julianischen Kalender
72    * @return das generische Datum
73    */
74   @Override
75   public long zuTagen(Datum d) {
76     return zuTagen(d.getJahr(), d.getMonat(), d.getTag());
77   }
78
79   /**
80    * Das julianische Datum aus einem generischen Datum bestimmen 
81    * 
82    * @param tage das generische Datum
83    * @return  das julianische Datum
84    */
85   @Override
86   public Datum vonTagen(long tage) {
87         long approx = ganzzahlQuotient(4 * (tage - STARTTAG) + 1464, 1461);
88     long jahr = approx <= 0 ? approx - 1 : approx;
89         long tageDavor = tage - zuTagen(jahr, Definition.JANUAR, 1);
90         int korrektur = tage < zuTagen(jahr, Definition.MAERZ, 1) ? 0 : (schaltjahr(jahr) ? 1 : 2);
91         int monat = (int)ganzzahlQuotient(12 * (tageDavor + korrektur) + 373, 367);
92         int tag = (int)(tage - zuTagen(jahr, monat, 1) + 1);
93     return new Datum(jahr, monat, tag);
94   }
95   
96   /* ------------ Besonderheiten des Julianischen Kalenders ---------- */
97   
98   /**
99    * Julianisches Schaltjahr
100    * @param jYear julianisches Jahr
101    * @return true, wenn Schaltjahr, false wenn nicht
102    */
103     public boolean schaltjahr(long jYear) {
104         return modulo(jYear, 4) == (jYear > 0 ? 0 : 3);
105     }
106       
107     public long BCE(long n) {
108         return -n;
109     }
110
111     public long CE(long n) {
112         return n;
113     }
9ada05 114 }