Java SimpleDataFormat未解析毫秒,MySql为舍入日期

Java SimpleDataFormat未解析毫秒,MySql为舍入日期,java,mysql,datetime,spring-boot,spring-data,Java,Mysql,Datetime,Spring Boot,Spring Data,我正在使用SimpleDataFormat来解析迄今为止的字符串。 解析之后,我将这个日期加载到mysql。问题是,到目前为止,毫秒还没有被解析,当我在Mysql上插入对象时,它会被取整 myStringDate = "2018-02-02 23:59:59.700" SimpleDateFormat fmt = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSS"); myObject.setDate(fmt.parse(myStringDate );

我正在使用SimpleDataFormat来解析迄今为止的字符串。 解析之后,我将这个日期加载到mysql。问题是,到目前为止,毫秒还没有被解析,当我在Mysql上插入对象时,它会被取整

myStringDate = "2018-02-02 23:59:59.700"
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss.SSS");
myObject.setDate(fmt.parse(myStringDate );
调试代码时,我可以看到日期为Sun Feb 02 23:59:59 BRST 2018(不是存储毫秒)

数据以“2017-02-03 00:00:00”的形式存储在mysql上

我的模型映射为:

import javax.persistence.*;
import java.util.Date;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "date")
private Date date;

MySqls上的列是DATETIME类型

如果您使用的是MySQL的5.6.4版,您可以通过使用分数秒数据类型声明列来看到这种情况

文档更详细地展示了此功能,就快速检查而言,您可以尝试
SELECT NOW(3)
应该以毫秒精度提供MySQL服务器操作系统的当前时间,如果您遇到错误,则说明您使用的版本不正确

除此之外,我们还建议将旧的连接器/J驱动程序改为
mysql-Connector-java-5.1.26.jar


希望这有助于回答您的问题

我认为毫秒实际上是被解析的,只是在显示日期以进行调试时没有看到默认格式的毫秒

使用此代码:

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String myStringDate = "2018-02-02 23:59:59.700";
Date date = fmt.parse(myStringDate);
System.out.println(date);
System.out.println(fmt.format(date));
我得到这个输出:

Fri Feb 02 23:59:59 EST 2018
2018-02-02 23:59:59.700

更新:确保当月使用大写字母
MM
,而不是
MM

对于
SimpleDateFormat
,一年中月份的模式应该是
MM
(大写)而不是
MM
(小写)。您的代码可能将月份读取为分钟值。

SQL中的日期格式为YY-MM-dd hh24:mi:ss:mmm,而Java中的日期格式为YY-MM-dd HH:MM:ss.SSS

tl;博士 智能类型,而不是哑字符串 数据以“2017-02-03 00:00:00”的形式存储在mysql上

不,数据不是这样存储的。你说:

MySqls上的列是DATETIME类型

这意味着日期时间不存储为文本,也没有“格式”

正如上面所说:

DATETIME类型用于同时包含日期和时间部分的值。MySQL以“YYYY-MM-DD HH:MM:SS”格式检索并显示日期时间值

关键词有:检索和显示。提取日期时间值后,将构造一些文本来表示该值不要将日期时间值的文本表示形式与日期时间值混为一谈。您的数据库和Java都有自己内部定义的存储日期时间的方法,但都不使用纯文本。数据库和Java都可以根据需要生成文本来显示日期时间值

未分区 我不是用户,但它的
DATETIME
类型似乎类似于SQL标准
TIMESTAMP,不带时区。这意味着它不代表实际的时刻,也不是时间线上的一个点。它代表大约26-27小时范围内的潜在力矩。没有or的上下文,它就没有真正的意义

java.time类 避免使用传统的日期时间类型。而只使用java.time类。根据,JPA和Hibernate现在支持java.time类型

如果您确实有输入文本,例如
2018-02-02 23:59:59.700
,请在缺少区域/偏移信息的情况下将其解析为。与MySQL类型
DATETIME
和SQL类型
TIMESTAMP(不带时区)一样,此类缺少任何区域/偏移的概念。要解析,将SQL风格从中间的空间转换为ISO 8601标准格式,中间有<代码> t>代码>
String input = "2018-02-02 23:59:59.700".replace( " " , "T" ) ;
在解析/生成字符串时,java.time类默认使用ISO 8601格式。因此,无需定义格式化模式

LocalDateDate ldt = LocalDateTime.parse( input ) ;
与数据库通信时不需要字符串。从JDBC4.2及更高版本开始,您可以直接交换java.time对象。(或者让JPA/Hibernate在封面下这样做。)

和检索

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
仅供参考,如果你真的试图及时跟踪特定时刻,你使用的类型是错误的。您应该在MySQL中使用
TIMESTAMP
,或者在标准SQL和Java use and中使用带时区的
TIMESTAMP


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android(我使用LocalDateTime:

      @列(name=“date”,columnDefinition=“DATETIME(3)”)
      private LocalDateTime date;

      Spring不支持现代的
      java.time
      日期和时间类型?我会使用
      LocalDateTime
      而不是
      date
      。该类和
      SimpleDateFormat
      早就过时了。现代API使用起来非常方便。请注意,分数部分是微秒(不是毫秒)。“DATETIME或TIMESTAMP值可以包含精度高达微秒(6位)的尾随小数秒部分…DATETIME值的范围是'1000-01-01 00:00:00.000000'到'9999-12-31 23:59:59.999999'”,而MySQL可能以微秒为单位处理Java的原始日期/时间API(OP使用的)只处理毫安
      myPreparedStatement.setObject( … , ldt ) ;
      
      LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;