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.ereignis;
19
20 import de.uhilger.zeitrechnung.kalender.ChristlicherKalender;
21 import de.uhilger.zeitrechnung.Datum;
22 import de.uhilger.zeitrechnung.Definition;
23 import java.util.ArrayList;
24 import java.util.List;
25
26 /**
27  * Die Klasse OsterEreignis dient zur Bestimmung des Zeitpunkts des
28  * Ostersonntages sowie davon abhaengiger Ereignisse.
29  *
30  * <p>
31  * Ein Objekt der Klasse OsterEreignis kann wiederverwendet werden. Es genuegt, 
32  * einer Instanz der Klasse OsterEreignis mehrfach hintereinander die 
33  * Definition zu uebergeben und dann die Methode getZeitpunkte fuer das 
34  * betreffende Jahr zu nutzen, also </p>
35  *
36  * <code>
37  *  OsterEreignis oe = new OsterEreignis();
38  *  Definition def = new Definition();
39  *  // erster Aufruf
40  *  def.setp1(3);
41  *  oe.setDefinition(def);
42  *  oe.getZeitpunkte(2022);
43  *  // zweiter Aufruf
44  *  def.setp1(51);
45  *  oe.setDefinition(def);
46  *  oe.getZeitpunkte(2022);
47  *  usw.
48  * </code>
49  *
50  * Solange das Jahr nicht wechselt, wird der Ostertermin nur einmal bestimmt.
51  *
52  * <p>
53  * Die Ereignis-Definition lautet:<br>
54  * OsterEreignis.getDefinition.setp1(Anzahl Tage vor (-) oder nach (+)
55  * Ostersonntag);<br>
56  * OsterEreignis.getDefinition.setp2(OsterEreignis.WESTLICH oder
57  * OsterEreignis.ORTHODOX);<br>
58  * wobei Monat einer Ganzzahl aus [Definition.JANUAR ..
59  * Definition.DEZEMBER] entspricht.
60  * </p>
61  *
62  * @author Ulrich Hilger
63  */
64 public class OsterEreignis extends EreignisBasis {
65
66   /** Typnummer fuer westliches Ostern */
67   public static final long WESTLICH = 1;
68   /** Typnummer fuer orthodoxes Ostern */
69   public static final long ORTHODOX = 2;
70
71   private long jahr;
72   private long ostern;
73   private long osterArt;
74
75   /**
76    * Ein Objekt der Klasse OsterEreignis erzeugen
77    */
78   public OsterEreignis() {
79     super();
80     jahr = Long.MIN_VALUE;
81     ostern = Long.MIN_VALUE;
82     osterArt = WESTLICH;
83   }
84
85   /**
86    * Den Typ des Ereignisses ermitteln
87    * 
88    * @return Ereignis.TYP_OSTERN
89    */
90   @Override
91   public int getTyp() {
92     return Ereignis.TYP_OSTERN;
93   }
94
95   /**
96    * Die Tage eines Jahres im gregorianischen Kalendersystem 
97    * ermitteln, an denen das Ereignis stattfindet.
98    * 
99    * @param isoJahr das Jahr im gregorianischen Kalender, 
100    * fuer das ermittelt werden soll, an welchen Tagen das Ereignis stattfindet
101    * @return die Liste aus Datum-Objekten, die die Tage im gregorianischen 
102    * Kalender bezeichnet, an denen das Ereignis stattfindet
103    */
104   @Override
105   public List<Datum> getZeitpunkte(long isoJahr) {
106     ChristlicherKalender ck = new ChristlicherKalender();
107     Definition def = getDefinition();
108     if (ostern > Long.MIN_VALUE && jahr == isoJahr && osterArt == def.getp2()) {
109       // Ostern wurde fuer das fragliche Jahr schon bestimmt
110     } else {
111       jahr = isoJahr;
112       osterArt = def.getp2();
113       if (osterArt == WESTLICH) {
114         ostern = ck.ostern(isoJahr);
115       } else {
116         ostern = ck.orthodoxesOstern(isoJahr);
117       }
118     }
119     Datum d = ck.vonTagen(ostern + getDefinition().getp1());
120     ArrayList list = new ArrayList();
121     list.add(d);
122     return list;
123   }
124 }