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点就变成了第二天凌晨一点。

相关推荐
Dcs几秒前
VSCode等多款主流 IDE 爆出安全漏洞!插件“伪装认证”可执行恶意命令!
java
神仙别闹5 分钟前
基于Python实现LSTM对股票走势的预测
开发语言·python·lstm
保持学习ing6 分钟前
day1--项目搭建and内容管理模块
java·数据库·后端·docker·虚拟机
京东云开发者18 分钟前
Java的SPI机制详解
java
超级小忍40 分钟前
服务端向客户端主动推送数据的几种方法(Spring Boot 环境)
java·spring boot·后端
程序无bug44 分钟前
Spring IoC注解式开发无敌详细(细节丰富)
java·后端
小莫分享1 小时前
Java Lombok 入门
java
程序无bug1 小时前
Spring 对于事务上的应用的详细说明
java·后端
食亨技术团队1 小时前
被忽略的 SAAS 生命线:操作日志有多重要
java·后端
苦学编程的谢1 小时前
Maven
java·maven·intellij-idea