Bestimmung der Zeitpunkte von Ereignissen
ulrich
2023-03-23 d20d989f5495492f1258c8313db7c19b429111a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
  Zeitrechnung - a class library to determine calendar events
  Copyright (c) 1984-2023 Ulrich Hilger, http://uhilger.de
 
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU Affero General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
 
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU Affero General Public License for more details.
 
  You should have received a copy of the GNU Affero General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package de.uhilger.zeitrechnung.kalender;
 
import de.uhilger.zeitrechnung.Datum;
import de.uhilger.zeitrechnung.Definition;
 
/**
 * Die Klasse MuslimischerKalender dient zu Umwandlung von generischem 
 * Datum zu muslimischem Datum und umgekehrt.
 * 
 * @author Ulrich Hilger
 */
public class MuslimischerKalender extends BasisKalender implements Wandler {
  
  /**
   * Die muslimische Zeitrechnung beginnt am 16. Juli 622 CE. 
   * Der STARTTAG wird im Konstruktor dieser Klasse auf diesen 
   * Tag gesetzt.
   */
    private final long STARTTAG;
 
  /**
   * Die Monatsnamen im muslimischen Kalender
   */
    public static final String[] monatsnamen = new String[] {
        "Muharram",
        "Safar",
        "Rabi I",
        "Rabi II",
        "Jumada I",
        "Jumada II",
        "Rajab",
        "Sha`ban",
        "Ramadan",
        "Shawwal",
        "Dhu al-Qa`da",
        "Dhu al-Hijja"};
  
  /**
   * Ein Objekt der KLasse MuslimischerKalender erzeugen
   */
  public MuslimischerKalender() {
    super();
    JulianischerKalender j = new JulianischerKalender();
    STARTTAG = j.zuTagen(j.CE(622), Definition.JULI, 16);
  }
 
  /**
   * Die Anzahl der Tage ermitteln, die zwischen einem gegebenen Datum 
   * des muslimischen Kalendersystems und dem Tag liegen, der im
   * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist.
   * 
   * @param jahr das Jahr im muslimischen Kalendersystem
   * @param monat der Monat im muslimischen Kalendersystem
   * @param tag der Tag im muslimischen Kalendersysem
   * 
   * @return Anzahl Tage, die zwischen dem gegebenen Datum 
   * und dem Tag liegen, der im 
   * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist. 
   * Liegt das gegebene Datum vor dem 1. Januar 1 (gregorianisch), wird 
   * eine negative Zahl zurueckgegeben. 
   */  
  @Override
  public long zuTagen(long jahr, int monat, int tag) {
        return tag
            + 29 * (monat - 1)
            + ganzzahlQuotient((6 * monat) - 1, 11)
            + (jahr - 1) * 354
            + ganzzahlQuotient(3 + 11 * jahr, 30)
            + STARTTAG - 1;
  }
 
  /**
   * Die Anzahl der Tage ermitteln, die zwischen einem gegebenen Datum 
   * des muslimischen Kalendersystems und dem Tag liegen, der im
   * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist.
   * 
   * @param mDatum das Datum im muslimischen Kalendersystem
   * 
   * @return Anzahl Tage, die zwischen dem gegebenen Datum 
   * und dem Tag liegen, der im 
   * Gregorianischen Kalender mit dem Datum 1. Januar 1 bezeichnet ist. 
   * Liegt das gegebene Datum vor dem 1. Januar 1 (gregorianisch), wird 
   * eine negative Zahl zurueckgegeben. 
   */    
  @Override
  public long zuTagen(Datum mDatum) {
    return zuTagen(mDatum.getJahr(), mDatum.getMonat(), mDatum.getTag());
  }
 
  /**
   * Das Datum im muslimischen Kalendersystem fuer ein generisches Datum 
   * ermitteln.
   * 
   * @param tage Anzahl der Tage zwischen 1. Januar 1 im gregorianischen 
   * Kalender und dem Tag, dessen Datum im betreffenden Kalendersystem 
   * ermittelt werden soll
   * @return das Datum im muslimischen Kalendersystem
   */
  @Override
  public Datum vonTagen(long tage) {
    long jahr = ganzzahlQuotient(30 * (tage - STARTTAG) + 10646, 10631);
        long anzahlTageVor = tage - zuTagen(jahr, 1, 1);
        int monat = (int) ganzzahlQuotient(11 * anzahlTageVor + 330, 325);
        int tag = (int)(1 + tage - zuTagen(jahr, monat, 1));
    Datum d = new Datum();
        d.setJahr(jahr);
    d.setMonat(monat);
    d.setTag(tag);
    return d;
  } 
}