`
javayestome
  • 浏览: 1007125 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

编写与历史或历法有关的程序时,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 使用GregorianCalendar类获取系统的当前时间

    java 使用GregorianCalendar类获取系统的当前时间 java 使用GregorianCalendar类获取系统的当前时间

    Java的GregorianCalendar类打印出当月的日历

    利用GregorianCalendar类实现当月日历的打印。

    java API 在包java.util中有一个GregorianCalendar类,使用它可以得到一年内某个月的日历.zip

    java API 在包java.util中有一个GregorianCalendar类,使用它可以得到一年内某个月的日历.zip

    java中的日期处理类总结:DateCalendarGregorianCalendarDateFormatSimpleDateFormat类

    java中的日期处理类总结:DateCalendarGregorianCalendarDateFormatSimpleDateFormat类.txt

    Java开发技术大全(500个源代码).

    示例描述:本章学习对象和类。 accessMember.java 访问成员变量示例 constructNoPara.java 无参数的构造方法 constructWithPara.java 带参数的构造方法 declareDefault.java 缺省访问权限的使用 declarePrivate...

    Java基础之Date和Calendar类的使用方法

    Date类顾名思义,一看就知道是和日期有关的类了,这个类最主要的作用就是获得当 前时间了,然而这个类里面也具有设置时间以及一些其他的功能,可是由于本身设计的问题,这些方法却遭到众多批评,而这些遭受批评的...

    JAVA类的构造定义演示例程

    一个构造方法,带参数,初始化各个属性,特别要求带有年月日的参数,并利用GregorianCalendar日历类生成日期并转化成对应的Date类的日期. 对于每个属性添加一个set和get方法(建议使用Eclipse的Refactor中的...

    Java 类的继承基础练习、GregorianCalendar的使用

    Daniel Liang: Introduction to Java Programming 10th, p. 445 得到继承层次如图所示: 定义Person类 class Person { String name; String address; String phoneNumber; String emailAddress; public ...

    java日期处理小结

    java日期处理 和格式解析 包含java.util.Calender java.util. GregorianCalendar java.util.Date

    java日期处理总结

    java中关于日期处理的总结,包含各种日期格式之间的...java.util.GregorianCalendar(是Calendar的子类,日期处理时候经常使用该类)***** java.text.DateFormat(抽象类) java.text.SimpleDateFormat(是DateFormat的子类,

    JAVA 范例大全 光盘 资源

    常见问题 找不到类文件 6 常见问题 语法错误 7 第2章 Java基础语法 9 实例4 变量和常量 9 实例5 基本数据类型转换 10 实例6 操作多种运算符 12 实例7 不同数制间的转换 17 实例8 多种方式实现阶乘的算法 20 ...

    java 计时器

    java 计时器用法 GregorianCalendar用法

    Java2核心技术.part5

    4.2.2 Java库中的GregorianCalendar类 4.2.3更改器方法与访问器方法 4.3用户自定义类 4.3.1一个Employee类 4.3.2多个源文件的使用 4.3.3解析Employee类 4.3.4从构造器开始 5.2.2相等测试与...

    Java输出系统当前的日期(年月日时分秒毫秒)

    代码如下: package test.... import java.util.GregorianCalendar; public class TestOutDate { public static void main(String[] args) { //method 1 Calendar nowtime = new GregorianCalendar(); String strDateT

    秋哥公历工具类QiuGeCalendar.java

    QiuGeCalendar.java,公历工具类,简单好用,速度比官方JDK的GregorianCalendar.java快1倍以上。年范围:-5879490 ~ 5879610。不惧万年虫。 EpochDay概念被删除,对照LocalDate类,当年份小于1582年时,LocalDate...

    java范例开发大全源代码

     实例193 使用GregorianCalendar类获取系统的当前时间 326  实例194 使用SimpleDateFormat类获取系统的当前时间 329  实例195 显示某年某月某一周的信息 330  实例196 显示某年某月的信息 332  实例197...

    java范例开发大全

    实例193 使用GregorianCalendar类获取系统的当前时间 326 实例194 使用SimpleDateFormat类获取系统的当前时间 329 实例195 显示某年某月某一周的信息 330 实例196 显示某年某月的信息 332 实例197 时间的设置与获取 ...

Global site tag (gtag.js) - Google Analytics