Java Date vs Gregorian Calendar / 48h的区别?

时间:2017-08-22 15:47:38

标签: java calendar

我在工作中遇到了一个奇怪的情况,应用程序向我们发送了包含值“0001-01-01”的XML,该值被解析为XmlGregorianCalendar的实例。然后我意识到,这个值神奇地转换为“0001-01-03”,确切地增加了2天。

这是在从GregorianCalendar转换为日期期间发生的,我转载如下:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

public class Test {

    public static void main(String[] args) throws ParseException, DatatypeConfigurationException {
        final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        GregorianCalendar gregCalendar = new GregorianCalendar();
        gregCalendar.setTime(dateFormat.parse("0001-01-01"));
        XMLGregorianCalendar calendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregCalendar);

        System.out.println("calendar: " + calendar);
        System.out.println("date: " + calendar.toGregorianCalendar().getTime());
    }
}

示例输出:

  

日历:0001-01-01T00:00:00.000Z
日期:星期一03月03日00:00:00 GMT 1

毫秒的确切数量为172800000.有人知道为什么吗?

1 个答案:

答案 0 :(得分:4)

可爱不是吗? Java GregorianCalendar 是一个预感格里高利历(尽管名称具有误导性) 复合日历由Julian开头和格里高利结束。 (您甚至可以自己设置转换日期。)

在阳历中,0001年1月1日是星期一。

在朱利安历法中,0001年1月1日是星期六。

在那里,我的朋友,两天的差异。

参考文献:

https://www.timeanddate.com/calendar/?year=1&country=22 https://www.timeanddate.com/calendar/?year=1&country=23 https://en.wikipedia.org/wiki/Adoption_of_the_Gregorian_calendar https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html

特别是在最终链接中查看SetGregorianChange