对症下药:插入时间前,将时间的毫秒值统一设置为0即可。使用JDK中的日历类Calendar来实现。
这个功能要多次用到,写个工具类吧。
package util;
import java.util.Calendar;
import java.util.Date;
* @Description 精确的时间工具类
* @Author DongPo
public class PreciseTimeUtil {
* 设置时间的毫秒值为0
* @param date
* @return
public static Date getPreciseTime(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.MILLISECOND, 0);
return c.getTime();
MySQL 当中默认的时间类型(datetime 和 timestamp)的精度是秒,如果设置进去的时间值精度小于秒的话,就会被四舍五入,可能导致数据库中的值比原始值多了一秒。也就是说,本来属于今天的记录可能会被记到明天。
下面是一个例子,演示了时间是如何进位的。首先创建一张表:
CREATE TABLE test_time (
time_sec datetime,
time_millis datetime(3),
time_micros datetime(6),
stamp_sec timestamp,
stamp_millis timestamp(3),
stamp_m
select date_add(@dt, interval 1 day); - 加1天
select date_add(@dt, interval 1 hour); -加1小时
select date_add(@dt, interva
这是由于new Date()时,实际上是调用的System.currentTimeMillis()方法,即获得以毫秒为级别的时间戳。一般数据库表的字段类型datetime/timestamp长度都是设置为0。MySQL数据库对于毫秒大于500的数据进行进位,所以就造成的MySQL中的时间多一秒。
解决方案:1、将数据库表字段类型datetime/timestamp长度设置不为0即可2、在代码...
Mysql 时间戳TimeStamp数据类型默认是不带毫秒部分的,需要的时候首先要在字段的长度上加上毫秒即 timestamp (3)字段长度是3,所以自动截断成保留前3位,当然也可以定义成长度5,这样尽可能保留数据的最高精度!注意:这里时间戳虽然是5位小数,但是。
ALTER TABLE `table_name`
ADD COLUMN `order_time` timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '毫秒级时间戳'...
TIMESTAMP的变体1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP在创建新记录和修改现有记录的时候都对这个数据列刷新2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP 在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它3,TIMESTAMP ON UPDATE CUR...
我们需要根据日期入参,保存数据库该日期的当天最后时刻。如2020-03-20,那么我们希望插入数据库的值为2020-03-20 23:59:59,下面是工具类,希望调用getDayStart()方法达成我们的目标。public class PointTime {Date rawDate;public PointTime(Date rawDate) {super();this.rawDate = r...
date存入mysql中时,多了一秒的解决方案
在项目中可能用时间作为盐值加密或者时间快照来判断一些业务逻辑。但是每次从数据库中取回来时,总是会发现多一秒的情况。
mysql的驱动升级导致的 会将大于500毫秒的时间四舍五入。
核心代码(Java)
采用apache的DateUtils类进行操作。
DateUtils.round(new Date(),Calendar.SEC......
今天新增一个需求,要根据datetime字段匹配几张表里的记录值。结果发现总是有几条记录莫名其妙多1秒钟,开始以为是数据来源那边有问题,经过一系列排查发现数据到插入前都是对的…
度娘说是mysql保存日期时间值时会对毫秒级的精度进行调整,四舍五入。这么一说就清楚了呀。
3.解决方案
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.MILLISECOND, 0);
原因:mysql数据库对于毫秒数>500会自动加一秒,所以设置时间为59分59秒时,要设置毫秒数为0.
endCalendar.set(Calendar.HOUR_OF_DAY, 23);
endCalendar.set(Calendar.MINUTE, 59);
endCalendar.set(Calendar.SECOND, 59);
endCalendar.set(Calendar.MILLISECOND,0);
最近项目中在做JWT登录的时候,根据当前时间做签名密钥,生成的Token,并且将当前时间也保存在了用户表中的last_login(最后登录时间),最后在做检验的时候,根据JWT中存的用户id,查询用户的最后一次登录时间,然后创建签名密钥,去调用校验Token的方法,结果老是校验不通过!
debug了以后发现了问题,数据库存放的last_login,比生成Token是的那个时间多了一秒,密钥不对,...