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