Calendar.set陷阱-Calendar.Hour&Calendar.Hour_of_day

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)

上面的例子,相同的時(shí)間在用calendar.set賦值分別用Calendar.HOUR,Calendar.HOUR_OF_DAY有不同的結(jié)果一個(gè)是17:00,一個(gè)是5:00

原因分析

Calendar.HOUR是12小時(shí)制,設(shè)置的值大于等于12時(shí),得到的結(jié)果會(huì)是day+1,凌晨和中午都是0,不是12;需要配合Calendar.AM_PM使用;
Calendar.HOUR_OF_DAY是24小時(shí)制
為什么題主用Calendar.HOUR會(huì)取到17:00呢,這是由于Calendar.HOUR的另一個(gè)機(jī)制區(qū)分上午、下午參數(shù)Calendar.AM_PM導(dǎo)致的,題主當(dāng)時(shí)系統(tǒng)時(shí)間是14:00下午,在第四行代碼setTime的時(shí)候已經(jīng)設(shè)置Calendar.PM(1)了,因此設(shè)置完calendar.set(Calendar.HOUR, 5)后又轉(zhuǎn)化時(shí)間格式打印出的是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);
            }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容