加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 日历设置YEAR问题

发布时间:2020-12-14 23:59:46 所属栏目:Java 来源:网络整理
导读:我尝试了以下代码: 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_YEA
我尝试了以下代码:
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

哪里不对?我不应该以这种方式使用日历设置YEAR?

解决方法

这一年是相对于时代的.通过将年份设置为小于或等于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

因此,不要将年份设定为2001年,您必须将其设置为-2000(因为0年根本不存在).或者你可以明确地设定时代:

c2.set(Calendar.ERA,GregorianCalendar.AD);

解决这个“错误”的另一种方法是在完整日期设置之前不读取时间:

Calendar c1 = Calendar.getInstance(); // August  16th,0 AD
c1.set(Calendar.YEAR,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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读