Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-23 d20d989f5495492f1258c8313db7c19b429111a3
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 MuslimischerKalender dient zu Umwandlung von generischem 
25  * Datum zu muslimischem Datum und umgekehrt.
26  * 
27  * @author Ulrich Hilger
28  */
29 public class MuslimischerKalender extends BasisKalender implements Wandler {
30   
31   /**
32    * Die muslimische Zeitrechnung beginnt am 16. Juli 622 CE. 
33    * Der STARTTAG wird im Konstruktor dieser Klasse auf diesen 
34    * Tag gesetzt.
35    */
36     private final long STARTTAG;
37
38   /**
39    * Die Monatsnamen im muslimischen Kalender
40    */
41     public static final String[] monatsnamen = new String[] {
42         "Muharram",
43         "Safar",
44         "Rabi I",
45         "Rabi II",
46         "Jumada I",
47         "Jumada II",
48         "Rajab",
49         "Sha`ban",
50         "Ramadan",
51         "Shawwal",
52         "Dhu al-Qa`da",
53         "Dhu al-Hijja"};
54   
55   /**
56    * Ein Objekt der KLasse MuslimischerKalender erzeugen
57    */
58   public MuslimischerKalender() {
59     super();
60     JulianischerKalender j = new JulianischerKalender();
61     STARTTAG = j.zuTagen(j.CE(622), Definition.JULI, 16);
62   }
63
64   /**
65    * Die Anzahl der Tage ermitteln, die zwischen einem gegebenen Datum 
66    * des muslimischen Kalendersystems und dem Tag liegen, der im
67    * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist.
68    * 
69    * @param jahr das Jahr im muslimischen Kalendersystem
70    * @param monat der Monat im muslimischen Kalendersystem
71    * @param tag der Tag im muslimischen Kalendersysem
72    * 
73    * @return Anzahl Tage, die zwischen dem gegebenen Datum 
74    * und dem Tag liegen, der im 
75    * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist. 
76    * Liegt das gegebene Datum vor dem 1. Januar 1 (gregorianisch), wird 
77    * eine negative Zahl zurueckgegeben. 
78    */  
79   @Override
80   public long zuTagen(long jahr, int monat, int tag) {
81         return tag
82             + 29 * (monat - 1)
83             + ganzzahlQuotient((6 * monat) - 1, 11)
84             + (jahr - 1) * 354
85             + ganzzahlQuotient(3 + 11 * jahr, 30)
86             + STARTTAG - 1;
87   }
88
89   /**
90    * Die Anzahl der Tage ermitteln, die zwischen einem gegebenen Datum 
91    * des muslimischen Kalendersystems und dem Tag liegen, der im
92    * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist.
93    * 
94    * @param mDatum das Datum im muslimischen Kalendersystem
95    * 
96    * @return Anzahl Tage, die zwischen dem gegebenen Datum 
97    * und dem Tag liegen, der im 
98    * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist. 
99    * Liegt das gegebene Datum vor dem 1. Januar 1 (gregorianisch), wird 
100    * eine negative Zahl zurueckgegeben. 
101    */    
102   @Override
103   public long zuTagen(Datum mDatum) {
104     return zuTagen(mDatum.getJahr(), mDatum.getMonat(), mDatum.getTag());
105   }
106
107   /**
108    * Das Datum im muslimischen Kalendersystem fuer ein generisches Datum 
109    * ermitteln.
110    * 
111    * @param tage Anzahl der Tage zwischen 1. Januar 1 im gregorianischen 
112    * Kalender und dem Tag, dessen Datum im betreffenden Kalendersystem 
113    * ermittelt werden soll
114    * @return das Datum im muslimischen Kalendersystem
115    */
116   @Override
117   public Datum vonTagen(long tage) {
118     long jahr = ganzzahlQuotient(30 * (tage - STARTTAG) + 10646, 10631);
119         long anzahlTageVor = tage - zuTagen(jahr, 1, 1);
120         int monat = (int) ganzzahlQuotient(11 * anzahlTageVor + 330, 325);
121         int tag = (int)(1 + tage - zuTagen(jahr, monat, 1));
122     Datum d = new Datum();
123         d.setJahr(jahr);
124     d.setMonat(monat);
125     d.setTag(tag);
126     return d;
127   } 
128 }