在做定时任务需求时 我是采用redis保存定时任务 的 在删除任务时间 需要比对数据库中去除的时间毫秒值 和 redis zset中的score分值 我发现数据库中数据已经删除 但是redis中set 对应的键值对仍然存在 百思不得其解 后来debug 发现毫秒值转为时间存到数据库中 再取出 时间毫秒部分竟然变成了 导致 redis中存储的 是xxxx87256 而数据库中取出时间转为毫秒值变为 XXXXX87000 所以redis 没有找到对用的键值对
在进行时间计算或存储时,可以使用 Date
类来表示精确到毫秒的时间信息。但需要注意的是,Date
类是线程不安全的,而且在 Java 8 及更高版本中已经被弃用。推荐使用 java.time
包中的日期和时间类,如 Instant
、LocalDateTime
、ZonedDateTime
等,它们提供了更丰富的日期时间操作和更好的线程安全性
解决方法。
Date类换为LocalDateTime试下
LocalDateTime
类是 Java 8 引入的日期时间类,用于表示不带时区信息的日期和时间。它的精度是到纳秒级别,而不是毫秒级别。
在使用 LocalDateTime
类进行时间计算或存储时,是不会丢失毫秒部分的精度的。LocalDateTime
类的 toString()
方法默认以 ISO-8601 格式输出,包含毫秒部分,如 2023-06-22T10:15:30.123456789
。
重新试了下 发现不是Java中时间类的问题 而是Mysql中dateTime只保存到秒的数据 会丢失精度
MySQL 的 DATETIME 数据类型只能存储到秒的精度,无法保存毫秒部分的精度。因此,当使用 DATETIME 类型存储时间时,毫秒部分会被忽略,导致丢失精度。
如果需要保存毫秒精度的时间,可以考虑使用 MySQL 的 DATETIME(3) 或 TIMESTAMP(3) 数据类型。这些类型允许存储毫秒级别的精度,分别支持 3 位小数的毫秒。
破案了: Mysql 5.5不能存储微秒,此功能是在5.6.4中引入的
完蛋 没得玩!