我在工作中遇到了一个奇怪的情况,应用程序向我们发送了包含值“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.有人知道为什么吗?
答案 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
。