Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-23 d20d989f5495492f1258c8313db7c19b429111a3
commit | author | age
d20d98 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.ChinesischesDatum;
21 import de.uhilger.zeitrechnung.Datum;
22 import de.uhilger.zeitrechnung.Definition;
23 import de.uhilger.zeitrechnung.kalender.ChinesischerKalender;
24 import de.uhilger.zeitrechnung.kalender.ISOKalender;
25 import java.util.ArrayList;
26 import java.util.List;
27
28 /**
29  * Ein Ereignis, das durch ein Datum im traditionellen 
30  * chinesischen Kalender definiert ist.
31  * 
32  * <p>Soll nicht ein Ereignis bestimmt sondern in den oder vom chinesischen 
33  * Kalender umgerechnet werden, muss die Klasse ChinesischerKalender genutzt 
34  * werden.</p> 
35  * 
36  * <p>
37  * Die Ereignis-Definition lautet:<br> 
38  * ChinesischesEreignis.getDefinition.setp1(Monat des chinesischen Kalenders);<br>
39  * ChinesischesEreignis.getDefinition.setp2(Tag im Monat des chinesischen Kalenders);<br>
40  * wobei Monat einer Ganzzahl aus 
41  * [ChinesischerKalender.noch-angeben .. ChinesischerKalender.noch-angeben] 
42  * entspricht.
43  * </p>
44  * 
45  * @author Ulrich Hilger
46  */
47 public class ChinesischesEreignis extends EreignisBasis {
48
49   @Override
50   public int getTyp() {
51     return EreignisBasis.TYP_CHINESISCH;
52   }
53
54   @Override
55   public List<Datum> getZeitpunkte(long isoJahr) {
56     Definition def = getDefinition();
57     ChinesischerKalender j = new ChinesischerKalender();
58     long tag = j.cDatumZuGenerisch(isoJahr, (int) def.getp1(), (int) def.getp2());
59     List daten = new ArrayList();
60     daten.add(new ISOKalender().vonTagen(tag));
61     return daten;
62   }
63
64   public List<Datum> getZeitpunkte2(long isoJahr) {
65     ISOKalender w = new ISOKalender();
66     long start = w.zuTagen(isoJahr, Definition.JANUAR, 1);
67     long ende = w.zuTagen(isoJahr, Definition.DEZEMBER, 31);
68
69     ChinesischerKalender j = new ChinesischerKalender();
70     Definition def = getDefinition();
71     List daten = new ArrayList();
72     long y = 0;
73     long tag = start;
74     long ersterJanuar = start;
75     while(tag < ende) {
76       
77       // Neujahr vor dem 1.1. als generisches Datum
78       long cNeujahr = j.neujahrAmOderVor(ersterJanuar); 
79       
80       // Neujahrstag als chinesisches Datum, z.B. 7. Feb 2022 für Neujahr vor 1.1.2023
81       ChinesischesDatum cdNeujahr = j.vonTagen(cNeujahr);
82       
83       // generisches Datum fuer den Tag des Ereignisses bestimmen, 
84       // Ereignisse fallen nie auf Schaltmonate, deshalb schaltmonat auf false
85       tag = j.zuTagen(cdNeujahr.getZyklus(), (int) cdNeujahr.getJahr(), (int) def.getp1(), 
86               false, (int) def.getp2());
87       
88       // der Liste hinzufügen, wenn das Ereignis ins isoJahr fällt
89       if (tag >= start && tag <= ende) {
90         Datum d = w.vonTagen(tag);
91         daten.add(d);
92       }
93       
94       // für nächstes Jahr wiederholen, bis das Ereignis nicht mehr im isoJahr liegt 
95       ++y;
96       ersterJanuar = w.zuTagen(isoJahr+y, Definition.JANUAR, 1);
97     }
98     return daten;
99   }
100 }