diff --git a/time4j-android/src/main/java/net/time4j/calendar/EastAsianCalendar.java b/time4j-android/src/main/java/net/time4j/calendar/EastAsianCalendar.java index 60c5957..3dfe779 100644 --- a/time4j-android/src/main/java/net/time4j/calendar/EastAsianCalendar.java +++ b/time4j-android/src/main/java/net/time4j/calendar/EastAsianCalendar.java @@ -23,10 +23,12 @@ import net.time4j.PlainTime; import net.time4j.Weekday; import net.time4j.base.MathUtils; +import net.time4j.engine.CalendarDays; import net.time4j.engine.CalendarSystem; import net.time4j.engine.Calendrical; import net.time4j.engine.ChronoElement; import net.time4j.engine.ElementRule; +import net.time4j.engine.EpochDays; import net.time4j.engine.IntElementRule; import net.time4j.engine.UnitRule; import net.time4j.format.CalendarType; @@ -204,6 +206,68 @@ public int getDayOfYear() { } + /** + *

Obtains the sexagesimal name of solar month component which repeats every 60th solar term.

+ * + * @return SexagesimalName + * @see #getSolarTerm() + * @since 4.7 + */ + /*[deutsch] + *

Liefert den sexagesimalen Namen der Sonnenmonatskomponente, der sich alle 60 Sonnenmonate wiederholt.

+ * + * @return SexagesimalName + * @see #getSolarTerm() + * @since 4.7 + */ + public SexagesimalName getSexagesimalMonth() { + + SolarTerm st = this.getSolarTerm(); + int solarMonth = MathUtils.floorModulo(st.getIndex() + 1, 12); + SexagesimalName.Branch branch = SexagesimalName.Branch.values()[solarMonth]; + int y = EastAsianYear.forGregorian(this.get(CommonElements.RELATED_GREGORIAN_YEAR)).getElapsedCyclicYears(); + + if (solarMonth <= 2) { + long daxue = + SolarTerm.MINOR_11_DAXUE_255.onOrAfter( + this.minus(CalendarDays.of(this.utcDays - this.newYearUTC(0))) + ).getDaysSinceEpochUTC(); + + if ((this.utcDays >= daxue) && (this.utcDays < this.newYearUTC(1))) { + y++; + } + } + + int elapsedMonths = MathUtils.floorModulo(12 * (y - 1) + solarMonth + 2, 10); + SexagesimalName.Stem stem = SexagesimalName.Stem.values()[elapsedMonths]; + return SexagesimalName.of(stem, branch); + + } + + /** + *

Obtains the sexagesimal name of day component which repeats every 60th day.

+ * + * @return SexagesimalName + * @since 4.7 + */ + /*[deutsch] + *

Liefert den sexagesimalen Namen der Tageskomponente, der sich alle 60 Tage wiederholt.

+ * + * @return SexagesimalName + * @since 4.7 + */ + public SexagesimalName getSexagesimalDay() { + + int elapsedDays = MathUtils.floorModulo(EpochDays.RATA_DIE.transform(this.utcDays, EpochDays.UTC) - 45, 60); + + if (elapsedDays == 0) { + elapsedDays = 60; + } + + return SexagesimalName.of(elapsedDays); + + } + /** *

Is the year of this date a leap year such that it contains a leap month?

* @@ -424,6 +488,10 @@ int getLeapMonth() { // needs to be overridden due to calendar specific zone offsets and epochs abstract EastAsianCS getCalendarSystem(); + private long newYearUTC(int delta) { + return this.getCalendarSystem().newYear(this.cycle, this.yearOfCycle + delta); + } + //~ Innere Klassen ---------------------------------------------------- private static class IntegerElementRule>