Java的GregorianCalendar类和相关的历法问题

原创 2004年05月17日 14:09:00

编写与历史或历法有关的程序时,JDK提供的GregorianCalendar类非常好用,它可以很好地再现奥古斯督修订后的儒略历以及1582年教皇改历后的格列高里历,即,1582年10月4日以前按儒略历规则处理,1582年10月15日以后按格列高里历处理,格列高里改历时隐去的10天也能正确处理(甚至可以针对西欧各国改历的先后,自行设定不同的改历时间GregorianCalendar.setGregorianChange())。

但GregorianCalendar类仍有其适用范围,它无法反映古罗马历法中,公元前45年至公元4年这一段时间内发生的历法混乱问题(这49年里古罗马历法远未完善,且史料不足,实际施行的历法难以考证,后人的研究结果也互有分歧)。比如,按照史学界最常见的一种看法,公元4年罗马未置闰年,该年2月仍是28天。但我们用GregorianCalendar类计算时,公元4年2月有29天。

如何处理这个问题,取决于你的关注点。如果你只想用一个通行的时间尺度去标定过去的事件,那你完全可以用GregorianCalendar类上推到任何一年。其实,当研究对象与人类历史或人类社会无关时,仅仅用格列高里历上推,而不考虑1582年以前的历法差异(主要差异在于百年置闰的方式)也是一种变通的方案。但是,如果你关心的是古罗马或与之相关的历史事件,或你希望以罗马实际施行的历法为参照系,你就必须为GregorianCalendar类引入修正代码。当然,如何修正,这还要取决于你对古罗马历法的具体意见,比如,你是否相信古罗马在公元4年失闰,你同意后人的哪种考据结果,等等。

下面是JDK 1.4文档中的相关解释:

However, dates obtained using GregorianCalendar are historically accurate only from March 1, 4 AD onward, when modern Julian calendar rules were adopted. Before this date, leap year rules were applied irregularly, and before 45 BC the Julian calendar did not even exist.

下面是学术界对公元前45年至公元4年,闰年设置混乱问题的不同意见:

The historic sequence of leap years (i.e. years with a leap day) in this period is not given explicitly by any ancient source, although the existence of the triennial cycle is confirmed by an inscription that dates from 9 or 8 BC. The chronologist Joseph Scaliger established in 1583 that the Augustan reform was instituted in 8 BC, and inferred that the sequence of leap years was 42 BC, 39 BC, 36 BC, 33 BC, 30 BC, 27 BC, 24 BC, 21 BC, 18 BC, 15 BC, 12 BC, 9 BC, AD 8, AD 12 etc. This proposal is still the most widely accepted solution.
Other solutions have been proposed from time to time. Kepler proposed in 1614 that the correct sequence of leap years was 43 BC, 40 BC, 37 BC, 34 BC, 31 BC, 28 BC, 25 BC, 22 BC, 19 BC, 16 BC, 13 BC, 10 BC, AD 8, AD 12 etc. In 1883 the German chronologist Matzat proposed 44 BC, 41 BC, 38 BC, 35 BC, 32 BC, 29 BC, 26 BC, 23 BC, 20 BC, 17 BC, 14 BC, 11 BC, AD 4, AD 8, AD 12 etc., based on a passage in Dio Cassius that mentions a leap day in 41 BC that was said to be contrary to Caesar's rule. It has also sometimes been suggested that 45 BC was a leap year. In the 1960s Radke argued the reform was actually instituted when Augustus became pontifex maximus in 12 BC, suggesting the sequence 45 BC, 42 BC, 39 BC, 36 BC, 33 BC, 30 BC, 27 BC, 24 BC, 21 BC, 18 BC, 15 BC, 12 BC, AD 4, AD 8, AD 12 etc.

In 1999, an Egyptian papyrus was published which gives an ephemeris table for 24 BC with both Roman and Egyptian dates. From this it can be shown that the most likely sequence was in fact 44 BC, 41 BC, 38 BC, 35 BC, 32 BC, 29 BC, 26 BC, 23 BC, 20 BC, 17 BC, 14 BC, 11 BC, 8 BC, AD 4, AD 8, AD12 etc., very close to that proposed by Matzat.

JAVA菜鸟入门篇 - Calendar日历类和GregorianCalendar公历类 (二十八)

Calendar日历类和GregorianCalendar公历类  相应的API文档:Calendar类和GregorianCalendar类 人们对于时间的认识是:某年某月某日,...
  • promise_LOVE
  • promise_LOVE
  • 2015年02月01日 15:56
  • 3588

Java常用类库——时间处理类Date、Calendar、GregorianCalendar以及日期格式化和计算

在Java中经常需要对时间进行操作,日期比较、格式转换、日期计算等。 经常使用的类有java.util.Date;java.sql.Date;java.util.Calendar;java.util....
  • Goskalrie
  • Goskalrie
  • 2016年02月29日 08:58
  • 2480

Java使用Calendar类在控制台输出指定年份和月份的日历

要输出指定年份和月份的日历首先要获知指定月有几天,指定月有几个星期,还有指定月的第一天和最后一天是星期几。 需要注意的是:在Calendar类中,星期日到六分别用1~7表示,而月份是从0开始计的,即...
  • jiayite
  • jiayite
  • 2015年09月05日 00:04
  • 6710

有关Java集合类的10大问题

原文地址:Top 10 questions about Java Collections
  • snarlfuture
  • snarlfuture
  • 2013年12月05日 01:14
  • 1707

关于Java的线程问题总结

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程...
  • g552092947
  • g552092947
  • 2016年08月12日 22:25
  • 946

GregorianCalendar类的日历应用

GregorianCalendar类的日历初步探索
  • SJshenjian
  • SJshenjian
  • 2017年07月20日 15:23
  • 109

java文件读写类及其用法介绍

本文主要是对Java文件读写操作中常用的类进行理顺,然后明白其用法,为之后能自如的进行文件读写操作打下基础。...
  • zhangbinu
  • zhangbinu
  • 2016年05月10日 13:53
  • 6596

使用递归遍历的方式生成所有的九宫格数独

程序很简单,就是从九宫格的(0,0)位置开始,从左到右从上到下对每个位置进行遍历,找到当前位置能用的所有数字,然后依次选取一个数字填充到当前位置,然后对下一个位置递归调用本函数进行遍历,最终会生成所有...
  • WitsMakeMen
  • WitsMakeMen
  • 2013年04月19日 19:20
  • 3437

使用GregorianCalendar类实现日历程序

使用GregorianCalendar类实现日历程序         日历程序包含许多复杂的问题,例如:某一天是星期几,每个月有多少天等。使用GregorianCalendar类就使得这一切变得简单...
  • AengusChen
  • AengusChen
  • 2017年07月27日 15:31
  • 129

Java网络通信常用类介绍(Java.net包)

InetAddress类:表示互联网协议 (IP) 地址 URL类:代表一个统一资源定位符,它是指向互联网“资源”的指针。    资源可以是简单的文件或目录,也可以是对更为复杂的对象...
  • u011596455
  • u011596455
  • 2017年03月30日 10:14
  • 268
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的GregorianCalendar类和相关的历法问题
举报原因:
原因补充:

(最多只允许输入30个字)