Java设置日期时间的毫秒数为0

背景

做一个发送短信的需求,采用RabbitMQ来实现定时发送。发送时需要验证发送短信任务的预计发送时间和生产者传过来的时间是否一致,一致才发送。
结果在调试的时候,却发现任务一直没法触发。一步步调试,发现是两个时间不相等。明明是同一个变量,但存库之后再和原来的变量对比居然不相等。
仔细看了一下,发现了问题。从数据库取出来的Date对象没有毫秒,而直接创建的Date对象有毫秒,毫秒数不一样导致的两个Date对象不相等。原来是项目的实体类在时间类上面都加上了注解

@JsonFormat(timezone = “GMT+8”,pattern = “yyyy-MM-dd HH:mm:ss”)

这样在存储时间的时候,会把毫秒部分截掉,导致和原来创建的Date对象不相等。因此需要创建不带毫秒的日期对象。

解决方案

方案一

使用Date也可以做到,不过需要用到DateSimpleFormat,先转字符串,格式上去掉毫秒,然后再转回Date。不过这样写出的方法需要处理异常,其他方法调用比较麻烦。

方案二

使用Calendar类来实现。Calendar类可以用set方法设置毫秒值,设置完之后直接调用getTime转回Date。
在使用过程中发现了两个很像的常量。
在早上的时候设置不会有什么大影响
在这里插入图片描述

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.
     *
     * @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.
     *
     * @see #HOUR
     */
    public final static int HOUR_OF_DAY = 11;

从注释可以看出,前者是12小时制,后者是24小时制。只有在下午的时候才会凸显两者不同,就像注释说的,下午十点的时候,HOUR_OF_DAY的值是22,而HOUR的值是10。HOUR的值是需要配合着AM_PM来使用的。
因此,一般情况下直接使用HOUR_OF_DAY就对了。

虽然说HOUR代表12小时制,但是也是可以给HOUR设置超过12的值的,效果就是在日期基础上加上所设置的小时数。比如是上午13点,就变成了下午一点;下午13点就变成了第二天凌晨一点。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值