java - 为什么 GregorianCalendar.getInstance 包含儒略历类型的 calsys 和 cdate

标签 java date gregorian-calendar julian-date

我尝试将日期值设置为具有默认值的PreparedStatement,但该值有时会作为 JulianValue 返回。例如(假设spanBegin和spanEnd为空)

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

在第 3 行,由于日期 0000 年 1 月 1 日属于儒略历范围,因此 CDate 成为儒略历。然而,下一个 Date 即使是 9999 年,它的 CDate 仍然是儒略历。我必须创建另一个公历实例来解决该问题。

Calendar cal = new GregorianCalendar();
if (spanBegin == null) {
    cal.set(0000, Calendar.JANUARY, 1);
    spanBegin = cal.getTime();
}

Calendar cal = new GregorianCalendar();
if (spanEnd == null)
{
    cal.set(9999, Calendar.DECEMBER, 31);
    spanEnd = cal.getTime();
}

问题是,这是日期对象的预期行为还是错误?实际使用 GregorianCalendar.getInstance() 表明 cdate 有时会设置为 JulianCalendar。

最佳答案

直到 1582 年才出现公历。整个欧洲都在使用儒略历,直到由于太阳年不完全是 365.25 天,而是比这少一点而开始出现一些小问题。为了解决这个问题,教皇格列高利十三世下令将历法改为我们今天所知道的——每年除以 100 的年份都不是闰年,除非它除以 400。1582 年 10 月发生了过渡——4 号后的第二天Oct 是 10 月 15 日。这意味着直到 1582 年 10 月,公历和儒略历都是相同的。您可以阅读更多相关信息here

这就是 1582 年 10 月之前的日期被转换为使用儒略系统的原因。根据API如果你确实需要代表一个历史事件(这里的情况似乎并非如此),你只能从公元 4 年 3 月 1 日开始执行

关于java - 为什么 GregorianCalendar.getInstance 包含儒略历类型的 calsys 和 cdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1536148/

相关文章:

java - 将 2 月 28 日加 1 个月,结果应为 3 月 31 日

java - 为垃圾收集清除 BST 的最佳方法是什么?

mysql - 将 SQL 查询的结果限制为每个客户 ID 输入的最后日期

java - Date.toString() 显示什么时区?

c# - 在文件加载时重新格式化文件中的日期

c++ 公历和儒略历继承

objective-c - 当电话日历是非公历时,如何以公历格式获取今天的日期?

java - 消耗掉所有 Kafka 主题然后立即断开连接?

java - hibernate 中的连接代理错误

java - 抽屉导航在关闭时抽动