美文网首页问题集锦
Calendar.set陷阱-Calendar.Hour&Cal

Calendar.set陷阱-Calendar.Hour&Cal

作者: 五城十九洲 | 来源:发表于2019-10-21 17:45 被阅读0次

Calendar.HourvsCalendar.Hour_of_day

        Calendar workCalendar = Calendar.getInstance();
        workCalendar.setTime(new Date(-10800000));
        Calendar calendar = Calendar.getInstance();;
        calendar.setTime(new Date());
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, workCalendar.get(Calendar.MINUTE));
        calendar.set(Calendar.HOUR, workCalendar.get(Calendar.HOUR));
        System.out.println(calendar.getTime().getTime()/1000);
        calendar.set(Calendar.HOUR_OF_DAY, workCalendar.get(Calendar.HOUR));
        System.out.println(calendar.getTime().getTime()/1000);

result is:

1571648400  (2019-10-21 17:00:00)
1571605200  (2019-10-21 05:00:00)

上面的例子,相同的时间在用calendar.set赋值分别用Calendar.HOURCalendar.HOUR_OF_DAY有不同的结果一个是17:00,一个是5:00

原因分析

Calendar.HOUR是12小时制,设置的值大于等于12时,得到的结果会是day+1,凌晨和中午都是0,不是12;需要配合Calendar.AM_PM使用;
Calendar.HOUR_OF_DAY是24小时制
为什么题主用Calendar.HOUR会取到17:00呢,这是由于Calendar.HOUR的另一个机制区分上午、下午参数Calendar.AM_PM导致的,题主当时系统时间是14:00下午,在第四行代码setTime的时候已经设置Calendar.PM(1)了,因此设置完calendar.set(Calendar.HOUR, 5)后又转化时间格式打印出的是17:00
setTime源码分析java.util.GregorianCalendar#computeFields(int, int):

   if ((fieldMask & (HOUR_OF_DAY_MASK|AM_PM_MASK|HOUR_MASK
                          |MINUTE_MASK|SECOND_MASK|MILLISECOND_MASK)) != 0) {
            if (timeOfDay != 0) {
                int hours = timeOfDay / ONE_HOUR;
                internalSet(HOUR_OF_DAY, hours);
                internalSet(AM_PM, hours / 12); // Assume AM == 0
                internalSet(HOUR, hours % 12);
                int r = timeOfDay % ONE_HOUR;
                internalSet(MINUTE, r / ONE_MINUTE);
                r %= ONE_MINUTE;
                internalSet(SECOND, r / ONE_SECOND);
                internalSet(MILLISECOND, r % ONE_SECOND);
            } else {
                internalSet(HOUR_OF_DAY, 0);
                internalSet(AM_PM, AM);
                internalSet(HOUR, 0);
                internalSet(MINUTE, 0);
                internalSet(SECOND, 0);
                internalSet(MILLISECOND, 0);
            }

相关文章

  • Calendar.set陷阱-Calendar.Hour&Cal

    Calendar.HourvsCalendar.Hour_of_day result is: 上面的例子,相同的时...

  • 孟岩老师对区块链问题的解答之:第二问

    很多区块链项目的“通证经济系统”90%以上都会跌倒在代币陷阱、央行陷阱、黑箱陷阱、乌托邦陷阱、赌场陷阱、通缩陷阱、...

  • 【读书】解码青春期

    父母容易陷入的四种常见陷阱: 第一种陷阱:舒适陷阱。第二种陷阱:认可陷阱。第三种陷阱:控制陷阱。第四种:成就陷阱。...

  • 绕口令

    仙境里有陷阱 陷阱里没有仙境 仙境里的陷阱不是陷阱里的仙境 分不清是仙境还是陷阱

  • 你能听懂别人没说出来的意思吗?

    我觉得,在生活中,存在着各种各样的陷阱,网络陷阱、诈骗电话陷阱、消费陷阱等,甚至连有些言语也是陷阱…之所以这些陷阱...

  • 【0930晨读感悟 前方高能!小心思维陷阱。】

    前方高能!小心陷阱。 什么陷阱呢?思维陷阱。 其实人生处处有陷阱,尤其思维陷阱。 有些醒目一点的,我们就会小步跨过...

  • 28天从零变身职场理财达人(第四节课)

    如何识别并避开金融陷阱? 1.三类陷阱 陷阱一:央视广告=安全? 陷阱二:地方政府支持=安全? 陷阱三:银行=安全...

  • 思考快与慢

    大脑的运行模式引发了哪些直觉缺陷? 主要有四种:认知放松陷阱、自动替换陷阱、锚定陷阱和框架陷阱。 认知放松陷阱 如...

  • 2020-04-06原神第二章

    “陷阱1,陷阱2,隐藏在背后的目的......” “......陷阱3,陷阱4,我要一滴不留地品尝它......”...

  • "

    陷阱亦是考验 考验亦是陷阱

网友评论

    本文标题:Calendar.set陷阱-Calendar.Hour&Cal

    本文链接:https://www.haomeiwen.com/subject/yrtxvctx.html