Calendar.HOUR 和 Calendar.HOUR_OF_DAY

区别

/**
    * Field number for <code>get</code> and <code>set</code> indicating the
    * hour of the morning or afternoon. <code>HOUR</code> is used for the
    * 12-hour clock (0 - 11). Noon and midnight are represented by 0, not by 12.
    * E.g., at 10:04:15.250 PM the <code>HOUR</code> is 10.

    当用这个字段获取到的小时数,是指上午或下午的。HOUR 是用在12小时制的时钟。当中午和凌晨的时候,会再从0计数,不是12.
    例如: 10:04:15.250 PM , HOUR 字段值是 10。
    *
    * @see #AM_PM
    * @see #HOUR_OF_DAY
    */
public final static int HOUR = 10;

/**
    * Field number for <code>get</code> and <code>set</code> indicating the
    * hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
    * E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
    *

    用这个字段获取到的小时数,是指整天的。 HOUR_OF_DAY 是用在24小时制的时钟。
    例如:10:04:15.250 PM , HOUR_OF_DAY 字段值是 22 

    * @see #HOUR
    */
public final static int HOUR_OF_DAY = 11;

两个表示不一样 , HOUR 是 12 小时制 , HOUR_OF_DAY 是24小时制 。

Get

源代码的注释中已经给了GET 的例子 。

  • HOUR 是 12小时制 ,获取到的是 12 小时制的数值
  • HOUR_OF_DAY 是 24 小时制,获取到的是 24 小时制的数值

Set

这需要好好说道一下。 因为12小时制很迷惑人。
针对 HOUR_OF_DAY 举例子看一下 :

Calendar c = Calendar.getInstance();
//当前时间 2020-07-16 10:04:15
c.set(Calendar.HOUR_OF_DAY,2); //2020-07-16 02:04:15
c.set(Calendar.HOUR_OF_DAY,12); //2020-07-16 12:04:15
c.set(Calendar.HOUR_OF_DAY,18); //2020-07-16 18:04:15
c.set(Calendar.HOUR_OF_DAY,22); //2020-07-16 22:04:15
c.set(Calendar.HOUR_OF_DAY,24); //2020-07-17 00:04:15  , 这里已经是第二天了
c.set(Calendar.HOUR_OF_DAY,28); //2020-07-17 04:04:15  , 这里已经是第二天了
c.set(Calendar.HOUR_OF_DAY,36); //2020-07-17 12:04:15  , 这里已经是第二天了
c.set(Calendar.HOUR_OF_DAY,48); //2020-07-18 00:04:15  , 这里已经是第三天了
c.set(Calendar.HOUR_OF_DAY,60); //2020-07-18 12:04:15  , 这里已经是第三天了
c.set(Calendar.HOUR_OF_DAY,72); //2020-07-19 00:04:15  , 这里已经是第四天了

以上例子可以看出来,当设置的数值 < 24, 就当天的时间,当设置的数值 >= 24,就不是当天的了,而是后面的时间了。

从上面也可以看出规律 :

往后的天数(24小时区间) = 设置的数值 / 24

针对 HOUR 举个例子看一下:

//当前时间 10:04:15
Calendar c = Calendar.getInstance();
//当前时间 2020-07-16 10:04:15 , 这是【上午】的时间
c.set(Calendar.HOUR,2);    //2020-07-16 02:04:15 
c.set(Calendar.HOUR,8);    //2020-07-16 08:04:15 
c.set(Calendar.HOUR,11);   //2020-07-16 11:04:15 
c.set(Calendar.HOUR,12);   //2020-07-16 12:04:15 , 这是【中午】的时间
c.set(Calendar.HOUR,14);   //2020-07-16 14:04:15 , 这是【下午】的时间
c.set(Calendar.HOUR,18);   //2020-07-16 18:04:15 , 这是【下午】的时间
c.set(Calendar.HOUR,23);   //2020-07-16 23:04:15 , 这是【下午】的时间
c.set(Calendar.HOUR,24);   //2020-07-17 00:04:15 , 这是第二天【上午】的时间
c.set(Calendar.HOUR,28);   //2020-07-17 04:04:15 , 这是第二天【上午】的时间
c.set(Calendar.HOUR,36);   //2020-07-17 12:04:15 , 这是第二天【中午】的时间
c.set(Calendar.HOUR,48);   //2020-07-18 00:04:15 , 这是第三天【上午】的时间

//当前时间 2020-07-16 22:04:15 , 这是【下午】的时间
c.set(Calendar.HOUR,2);    //2020-07-16 14:04:15 
c.set(Calendar.HOUR,8);    //2020-07-16 20:04:15 
c.set(Calendar.HOUR,11);   //2020-07-16 23:04:15 
c.set(Calendar.HOUR,12);   //2020-07-17 00:04:15 , 这是第二天【上午】的时间
c.set(Calendar.HOUR,14);   //2020-07-17 02:04:15 , 这是第二天【上午】的时间
c.set(Calendar.HOUR,18);   //2020-07-17 06:04:15 , 这是第二天【上午】的时间
c.set(Calendar.HOUR,23);   //2020-07-17 11:04:15 , 这是第二天【上午】的时间
c.set(Calendar.HOUR,24);   //2020-07-17 12:04:15 , 这是第二天【中午】的时间
c.set(Calendar.HOUR,28);   //2020-07-17 16:04:15 , 这是第二天【下午】的时间
c.set(Calendar.HOUR,36);   //2020-07-18 00:04:15 , 这是第三天【上午】的时间
c.set(Calendar.HOUR,48);   //2020-07-18 12:04:15 , 这是第三天【中午】的时间

第一眼从表象上看,

【上午】的时间设置小时,跟24小时制得到的结果是一样的。

【下午】的时间设置小时,就不一样了。

总结规律就可以看出来,设置的数值 < 12 ,得到的是当前半天的小时数。上午得到是上午的小时数(从0点开始算),下午得到的是下午的小时数(从12点开始算)。

设置数值 >= 12 。是下个12小时区间的值。对比上面的24小时制,可以得到规律 :

往后的半天数(12小时区间) = 设置的数值 / 12

所以上午是按上午的时间 , 下午是按下午的时间。 我遇到的坑:神奇的【时间】问题

add

add 操作实测都是一样的了。 就是小时数量。两种类型没差。


如果文章有帮助到您,请点个赞,您的反馈会让我感到文章是有价值的

原文地址:https://www.cnblogs.com/ElEGenT/p/13322903.html