/*
|
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;
|
}
|
}
|