【问题标题】:How To Calculate Month From The Total Number Of Days Difference In Hebrew Calendar如何从希伯来日历中的总天数差异计算月份
【发布时间】:2019-10-01 12:19:03
【问题描述】:

我正在使用this 计算希伯来日历中的天数差异,它会返回正确的天数差异。现在我想将那些日子转换为几个月或几年。

但问题出在希伯来历法

希伯来历中的一年可以是 353、354、355、383、384 或 385 天长。普通的普通年有 12 个月,总共 354 天。闰年有13个月,有384天。几个月 奇数通常有 30 天,而偶数有几个月 有 29 天。

我尝试将天数除以一年中的总天数,但一年中的总天数不同。您能告诉我如何实现这一目标吗?

【问题讨论】:

  • 完全偏离主题,但有些年份有 12 个月,有些年份有 13 个月?哦,是的……
  • 那么你如何得到希伯来日历中总天数的月差
  • 很明显您需要从...开始的希伯来历的所有数据?
  • 有趣的问题...我看了ChronoLocalDate 并期待像HebrewDate 这样的东西,但没有这样的东西!
  • @aran 月历,我猜。这与太阳年不一致,所以有 13 个月的闰年来调整它,这样季节就不会变化太多?

标签: java calendar hebrew


【解决方案1】:

看起来像一个不断减法的循环是最容易理解的。我猜你知道不同年份的任何一端。然后这样的循环就可以工作了:

int yearBegin = 1234;
int daysDiff = calcDaysDiff(); // your existing routine
int yearAnalyzing = yearBegin;
int years = 0;
while (daysDiff > 0) {
    int daysInThatYear = calcDaysInYear (yearAnalyzing); // you calc accdg your rules
    while (daysDiff >= daysInThatYear) {
        ++years;
        daysDiff -= daysinThatYear;
        yearAnalyzing++; // or --, depending which direction you want to go
    }
    // less than a year is left
    // calculate the months (should be easy)
}

如果您的开始日期从年中开始,那么在开始循环之前,您必须先在这几天工作,然后再开始循环。

【讨论】:

  • 谢谢让我试试这个方法然后我会告诉你
  • 您无法在不知道开始日期或结束日期的情况下将日差转换为月差,因为日差可能会延长闰月,另请参阅我的回答。
  • @MenoHochschild,你说得对,我在计算两个希伯来日期之间的总日差的月份和年份时遇到了闰年的问题
【解决方案2】:

您可以使用我的库Time4J,它提供了确定以年、月或日为单位测量的差异的功能。示例(来自 JUnit 测试用例):

    HebrewCalendar start = HebrewCalendar.of(5778, HebrewMonth.HESHVAN, 6);
    HebrewCalendar end = HebrewCalendar.of(5778, HebrewMonth.ELUL, 6);

    assertThat(HebrewCalendar.Unit.MONTHS.between(start, end), is(10));

    start = start.plus(CalendarDays.ONE);
    assertThat(HebrewCalendar.Unit.MONTHS.between(start, end), is(9));

    start = start.minus(3, HebrewCalendar.Unit.YEARS);
    assertThat(HebrewCalendar.Unit.YEARS.between(start, end), is(3));

    start = start.plus(6, HebrewCalendar.Unit.YEARS).minus(CalendarDays.of(2)); // AM-5781-HESHVAN-5
    assertThat(HebrewCalendar.Unit.YEARS.between(start, end), is(-2));

    start = start.with(HebrewCalendar.MONTH_OF_YEAR, HebrewMonth.ELUL); // AM-5781-ELUL-5
    assertThat(HebrewCalendar.Unit.MONTHS.between(start, end), is(-36));

    start = start.plus(CalendarDays.ONE);
    assertThat(HebrewCalendar.Unit.MONTHS.between(start, end), is(-37));

    start = start.minus(37, HebrewCalendar.Unit.MONTHS);
    assertThat(start, is(end));

该逻辑在某种程度上类似于java.time-package 中的标准逻辑。当结束日期的日期小于开始日期的日期时,计算的月份增量(或年份增量)将减一。

一般来说,我不建议尝试使用固定因子将天数转换为月数或年数,因为希伯来历法有时是 12 个月,有时是 13 个月。我的库也没有尝试过,而是应用了一种优化的计数。 如果没有关于开始或结束日期的任何进一步信息,也无法将日增量转换为月增量,主要原因是:

Imagine the SAME day delta had been determined with a start date 
short before Adar I (leap month) or with another month later. Then the month
delta will be different because the second case does not include a leap month!

更多关于如何处理希伯来日历的例子可以在API online看到。

如果您使用的是 Android,请使用具有类似 API 的专用派生类 Time4A

【讨论】:

  • 谢谢,我会通过这个告诉你
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
相关资源
最近更新 更多