Java 历年发行
我尝试了以下代码:Java 历年发行,java,date,calendar,Java,Date,Calendar,我尝试了以下代码: Calendar c1 = Calendar.getInstance(); c1.set(Calendar.YEAR, 0); c1.set(Calendar.DAY_OF_YEAR, 1); Date d1 = c1.getTime(); Calendar c2 = Calendar.getInstance(); c2.setTime(d1); c2.set(Calendar.YEAR, 2001); c2.set(Calendar.DAY_OF_YEAR, 1); Sy
Calendar c1 = Calendar.getInstance();
c1.set(Calendar.YEAR, 0);
c1.set(Calendar.DAY_OF_YEAR, 1);
Date d1 = c1.getTime();
Calendar c2 = Calendar.getInstance();
c2.setTime(d1);
c2.set(Calendar.YEAR, 2001);
c2.set(Calendar.DAY_OF_YEAR, 1);
System.out.println(c2.getTime().toString());
Calendar c3 = Calendar.getInstance();
c3.set(Calendar.YEAR, 2000);
c3.set(Calendar.DAY_OF_YEAR, 1);
Date d2 = c3.getTime();
Calendar c4 = Calendar.getInstance();
c4.setTime(d2);
c4.set(Calendar.YEAR, 2001);
c4.set(Calendar.DAY_OF_YEAR, 1);
System.out.println(c4.getTime().toString());
结果是:
Wed Jan 01 23:47:00 CET 2001
Mon Jan 01 23:47:00 CET 2001
怎么了?我不应该这样使用日历来设置年份吗?在这两种情况下,在打印输出之前,您都将年份设置为2001年。在这两种情况下,产出都反映了当年的情况。您是否期望不同的产出?这一年与时代有关。通过将年份设置为小于或等于0,日历将通过切换纪元(从公元前到公元前或从公元前到公元前)自动更正此问题。这种行为在其他领域更为人所知。例如,如果您将月份设置为负数,则年份将相应递减 这些更正不是单独进行的,而是一次完成的,通常是在调用
getTime()
读取结果日期时
Calendar c1 = Calendar.getInstance(); // August 16th, 2012 AD
c1.set(Calendar.YEAR, 0); // August 16th, 0 AD
c1.set(Calendar.DAY_OF_YEAR, 1); // January 1st, 0 AD
Date d1 = c1.getTime(); // January 1st, 1 BC (corrected)
Calendar c2 = Calendar.getInstance();
c2.setTime(d1);
c2.set(Calendar.YEAR, 2001); // January 1st, 2001 BC
c2.set(Calendar.DAY_OF_YEAR, 1);
System.out.println(c2.getTime()); // prints "Wed Jan 01 05:35:00 CET 2001"
// because 01/01/2001 BC was a Wednesday
因此,不必将年份设置为2001年,而必须将其设置为-2000年(因为0年根本不存在)。或者,您可以明确设置纪元:
c2.set(Calendar.ERA, GregorianCalendar.AD);
解决此“错误”的另一种方法是不读取设置完成日期之前的时间:
Calendar c1 = Calendar.getInstance(); // August 16th, 2012 AD
c1.set(Calendar.YEAR, 0); // August 16th, 0 AD
c1.set(Calendar.DAY_OF_YEAR, 1); // January 1st, 0 AD
c1.set(Calendar.YEAR, 2001); // January 1st, 2001 AD
System.out.println(c1.getTime()); // prints the expected date
要输出日期的纪元,可以在SimpleDateFormat
模式中使用“G”:
new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy G").format(c2.getTime())
// "Wed Jan 01 05:35:00 CET 2001 BC"
星期三对星期一。此外,如果我将毫秒和秒设置为0,并比较这两个日期,结果将不相等。最初我的目的是规范化DateTime对象的day部分,以便只比较time部分。哈哈!什么。。。?是的,那个被我抓住了。在我看来,您已经识别了一个bug。异常行为似乎与c1年设置为0(或者是负年份)有关。当我在积极的岁月里尝试时,我只看到了正确的结果。