dif*_*ale 11 java calendar date
我尝试了以下代码:
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());
Run Code Online (Sandbox Code Playgroud)
结果是:
Wed Jan 01 23:47:00 CET 2001
Mon Jan 01 23:47:00 CET 2001
Run Code Online (Sandbox Code Playgroud)
怎么了?我不应该以这种方式使用日历来设置YEAR吗?
Rob*_*ert 15
这一年与时代有关.通过将年份设置为小于或等于0的值,日历会通过切换时代(从AD到BC或从BC到AD)自动更正这一点.从其他字段可以更好地了解此行为.例如,如果您将月份设置为负值,则年份会相应减少.
这些更正不是单独进行的,而是一次性完成,通常是在您打电话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
Run Code Online (Sandbox Code Playgroud)
因此,不必将年份设置为2001,而是必须将其设置为-2000(因为第0年根本不存在).或者你可以明确地设定时代:
c2.set(Calendar.ERA, GregorianCalendar.AD);
Run Code Online (Sandbox Code Playgroud)
解决这个"错误"的另一种方法是不读出设置完整日期之前的时间:
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
Run Code Online (Sandbox Code Playgroud)
要输出日期时代,您可以在以下模式中使用"G" SimpleDateFormat:
new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy G").format(c2.getTime())
// "Wed Jan 01 05:35:00 CET 2001 BC"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25976 次 |
| 最近记录: |