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

相关推荐
呜喵王阿尔萨斯1 分钟前
C/C++ const -- 多义混乱
c语言·开发语言·c++
__log1 分钟前
幂等性设计:从“重复提交“到“稳如磐石“的系统防护
java·开发语言·spring boot
spider_xcxc2 分钟前
Helm 部署 K8s 集群完整笔记
java·开发语言·kubernetes
海清河晏1113 分钟前
Qt实战:从零构建美化登录界面
开发语言·c++·qt
祐樹5 分钟前
1987年5月23日下午15-17点出生性格、运势和命运
java
zhangjw345 分钟前
第35篇:Spring Boot入门:自动配置+快速搭建,简化企业开发
java·spring boot·后端
一只小灿灿13 分钟前
C++ 各类特殊符号、运算符
开发语言·c++
Fu_Lin_16 分钟前
《Qt嵌入式从零基础到精通》前言与阅读指南
开发语言·qt
名字还没想好☜20 分钟前
Go 的 select 实战:超时、非阻塞收发与优雅退出的三个套路
开发语言·数据库·golang·go·并发
geovindu21 分钟前
java: Backtracking Algorithm
java·开发语言·windows·后端·算法·回溯算法