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区别

看看源码的注释:

java 复制代码
 /**
     * 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点就变成了第二天凌晨一点。

相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
lly2024064 小时前
Bootstrap 警告框
开发语言
2601_949146535 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX5 小时前
服务异步通信
开发语言·后端·微服务·ruby
zmzb01035 小时前
C++课后习题训练记录Day98
开发语言·c++
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7256 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎6 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven