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);
}