9

类中有一个常量Calendar叫做:UNDECIMBER。它描述了第 13 个月。

这个常数有什么有用的用途吗?在 Wikipedia 上写着它是用于农历的。但是这种日历没有实现。

第 14 个月(十二月)是否有任何解决方案?

我在网上没有找到这么多,我想了解更多关于这个主题的信息。

4

2 回答 2

7

如前所述,一些农历(和其他古代)日历有 13 个月。一个例子是科普特日历

尽管没有 13 个月的日历实现可以扩展java.util.Calendar,但在 Java 8 的新 API 中有一些。随着新 java.time API的引入,还创建了ThreeTen Extra 项目,其中包含一个实现

类 is org.threeten.extra.chrono.CopticChronology,它扩展了 native java.time.chrono.Chronology。我刚刚制作了一个示例代码来在这个日历中创建一个日期并循环遍历它的月份:

// Coptic calendar
CopticChronology cal = CopticChronology.INSTANCE;
// range for month of year (from 1 to 13)
System.out.println("month range: " + cal.range(ChronoField.MONTH_OF_YEAR)); // 1 - 13

// getting a date in Coptic calendar and loop through the months
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy");
// September 11th is equivalent to 01/01 in Coptic calendar
CopticDate d = cal.date(LocalDate.of(2017, 9, 11));
for (int i = 0; i < 14; i++) {
    System.out.println(fmt.format(d));
    d = d.plus(1, ChronoUnit.MONTHS);
}

输出是:

month range: 1 - 13
01/01/1734
01/02/1734
01/03/1734
01/04/1734
01/05/1734
01/06/1734
01/07/1734
01/08/1734
01/09/1734
01/10/1734
01/11/1734
01/12/1734
01/13/1734
01/01/1735

请注意,年份在第 13月之后发生了变化。


ThreeTen Extra 项目还实施埃塞俄比亚历法,该历法也有 13 个月。


并且,作为 14 个月日历的示例,有一个实现Pax Calendar的PaxChronology:一个提议的改革日历系统,但据我所知目前尚未使用。

引用维基百科:

普通年分为 13 个月,每个月 28 天,其名称与公历相同,只是在 11 月至 12 月之间有一个称为哥伦布的月份。每周、每月和每年的第一天是星期日。

在闰年,将在哥伦布之后插入一个称为 Pax 的一周月。

并根据javadoc

闰年出现在最后两位数可以被 6 整除、为 99 或为 00 且年份不能被 400 整除的年份。

例子:

PaxChronology paxCal = PaxChronology.INSTANCE;
System.out.println("month range: " + paxCal.range(ChronoField.MONTH_OF_YEAR));

PaxDate pd = paxCal.date(1930, 1, 1);
for (int i = 0; i < 15; i++) {
    // fmt is the same DateTimeFormatter from previous example
    System.out.println(fmt.format(pd));
    // adjusting for first day of next month - using TemporalAdjuster because
    // adding 1 ChronoUnit.MONTHS throws an exception for 14th month (not sure why)
    pd = pd.plus(30, ChronoUnit.DAYS).with(TemporalAdjusters.firstDayOfMonth());
}

输出:

month range: 1 - 13/14
01/01/1930
01/02/1930
01/03/1930
01/04/1930
01/05/1930
01/06/1930
01/07/1930
01/08/1930
01/09/1930
01/10/1930
01/11/1930
01/12/1930
01/13/1930
01/14/1930
01/01/1931

您会注意到年份在第 14月之后发生了变化。范围是1 - 13/14因为年份可以有 13 或 14 个月,这取决于它是否是闰年。

于 2017-06-25T05:15:36.423 回答
4

Calendar.UNDECIMBER是 Calendar 类中的一个附加常量,通常不用于广泛使用的公历,但某些农历使用第 13 个月。这就是这个领域的目的。

请参阅下面的 Java 文档:

https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#UNDECIMBER

维基百科的文章:

https://en.wikipedia.org/wiki/Undecimber

wiki中还提到了第 14 个月- Duocimber。不幸的是,Java(还)不支持这一点。


希望这可以帮助!

于 2017-06-23T09:15:38.193 回答