一个奇怪的异常

一个奇怪的异常

    @Test
    public void case2(){
        Calendar c = Calendar.getInstance();
        c.set(2023, 11-1, 8, 15, 23, 17);

//        int y1 = c.get(Calendar.YEAR);
//        int M1 = c.get(Calendar.MONTH) + 1;
//        int d1 = c.get(Calendar.DAY_OF_MONTH);
//        int H1 = c.get(Calendar.HOUR_OF_DAY);
//        int m1 = c.get(Calendar.MINUTE);
//        int s1 = c.get(Calendar.SECOND);
//        int S1 = c.get(Calendar.MILLISECOND);

        c.setTimeZone(TimeZone.getTimeZone("America/New_York"));

        int y = c.get(Calendar.YEAR);
        int M = c.get(Calendar.MONTH) + 1;
        int d = c.get(Calendar.DAY_OF_MONTH);
        int H = c.get(Calendar.HOUR_OF_DAY);
        int m = c.get(Calendar.MINUTE);
        int s = c.get(Calendar.SECOND);
        int S = c.get(Calendar.MILLISECOND);
        System.out.println(y+"-"+M+"-"+d+" "+H+":"+m+":"+s); 	
    }

输出结果:2023-11-8 15:23:17

将上例中的注释代码,任选一行或多行,取消掉它的注释,输出结果为:2023-11-8 2:23:17

想知道原因?


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小尤 2023-11-08 15:40:42

同学你好,这与时区有关系,因我们设置了时区,当两次时区不一致是就会出现问题,同学可以尝试将代码移动到    c.setTimeZone(TimeZone.getTimeZone("America/New_York"));下面,就不会出现该问题了。如下所示:

Calendar c = Calendar.getInstance();
        c.set(2023, 11-1, 8, 15, 23, 17);
	    c.setTimeZone(TimeZone.getTimeZone("America/New_York"));
//	        int y1 = c.get(Calendar.YEAR);
//	        int M1 = c.get(Calendar.MONTH) + 1;
//	        int d1 = c.get(Calendar.DAY_OF_MONTH);
//	        int H1 = c.get(Calendar.HOUR_OF_DAY);
//	        int m1 = c.get(Calendar.MINUTE);
        int s1 = c.get(Calendar.SECOND);
        int S1 = c.get(Calendar.MILLISECOND);
        
        
        int y = c.get(Calendar.YEAR);
        int M = c.get(Calendar.MONTH) + 1;
        int d = c.get(Calendar.DAY_OF_MONTH);
        int H = c.get(Calendar.HOUR_OF_DAY);
        int m = c.get(Calendar.MINUTE);
        int s = c.get(Calendar.SECOND);
        int S = c.get(Calendar.MILLISECOND);
        System.out.println(y+"-"+M+"-"+d+" "+H+":"+m+":"+s);

祝学习愉快!

  • 提问者 坨坨儿 #1

    你没回答我的问题呀,我只是调用了一下c.get()方法【一个获取语句而已】,并没有做任何操作,结果为什么会发生变化 ?

    2023-11-08 15:45:27
  • 好帮手慕小尤 回复 提问者 坨坨儿 #2

    同学你好,1、因Java获取到的时间默认使用的是操作系统的默认时区。如果我们的应用程序运行在一个不同的时区,那么获取到的时间就会与我们期望的结果不一致。

    2、

        1)输出没有设置时区前的数据,就会发现,第一次时间是正确的。程序直接使用默认时区。

            https://img1.sycdn.imooc.com/climg/654b49640948904a10880504.jpg

        2)而当我们设置时区后,再获取时间就会出现问题。如下图所示:此时因运行的时区不一致,从而导致出现偏差。

            https://img1.sycdn.imooc.com/climg/654b498909d7844312540494.jpg

        3)如果我们将时区设置与默认时区一样时,该问题不会出现了。如下所示:

            https://img1.sycdn.imooc.com/climg/654b49dc0942790f10930628.jpg

    祝学习愉快!

    2023-11-08 16:43:04
  • 提问者 坨坨儿 回复 好帮手慕小尤 #3

    老师讲的都是对的,也是很显然的,但是老师有没有发现一个问题,如果我上面程序代码的注释全部都注释掉,那么设置的时区并没有生效,请看下面的代码:

    @Test
        public void case1(){
            Calendar c = Calendar.getInstance();
            c.set(2023, 11-1, 8, 15, 23, 17);
            c.setTimeZone(TimeZone.getTimeZone("America/New_York"));  // 纽约时间
            int y = c.get(Calendar.YEAR);
            int M = c.get(Calendar.MONTH) + 1;
            int d = c.get(Calendar.DAY_OF_MONTH);
            int H = c.get(Calendar.HOUR_OF_DAY);
            int m = c.get(Calendar.MINUTE);
            int s = c.get(Calendar.SECOND);
            System.out.println(y+"-"+M+"-"+d+" "+H+":"+m+":"+s); 	// 输出:2023-11-8 15:23:17
    
            c.set(2023, 11-1, 8, 15, 23, 17);
            c.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo"));  // 东京时间
            int y1 = c.get(Calendar.YEAR);
            int M1 = c.get(Calendar.MONTH) + 1;
            int d1 = c.get(Calendar.DAY_OF_MONTH);
            int H1 = c.get(Calendar.HOUR_OF_DAY);
            int m1 = c.get(Calendar.MINUTE);
            int s1 = c.get(Calendar.SECOND);
            System.out.println(y1+"-"+M1+"-"+d1+" "+H1+":"+m1+":"+s1); 	// 输出:2023-11-8 15:23:17
    
            c.set(2023, 11-1, 8, 15, 23, 17);
            c.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));  // 上海时间
            int y2 = c.get(Calendar.YEAR);
            int M2 = c.get(Calendar.MONTH) + 1;
            int d2 = c.get(Calendar.DAY_OF_MONTH);
            int H2 = c.get(Calendar.HOUR_OF_DAY);
            int m2 = c.get(Calendar.MINUTE);
            int s2 = c.get(Calendar.SECOND);
            System.out.println(y2+"-"+M2+"-"+d2+" "+H2+":"+m2+":"+s2); 	// 输出:2023-11-8 15:23:17
    
        }

    我用同一时间,分别设置了3个时区,但是输出的结果是一样的,也就是说设置的时区显然没有生效,这才是问题

    2023-11-08 18:17:06
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

Java工程师 2024版
  • 参与学习       2020    人
  • 提交作业       1249    份
  • 解答问题       1202    个

2024重磅革新,超百小时内容豪华升级,加速提升高级技能与高薪就业竞争力 课程紧贴企业最新人才需求,历经7年持续迭代,帮助万名学子入行转行 从零起点到高阶实战,学习路径稳健顺滑,成就从小白到工程师高薪

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师