实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字

Posted

技术标签:

【中文标题】实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字【英文标题】:Local date time in entity ignoring last 3 digits of given format on save 【发布时间】:2019-07-29 22:34:46 【问题描述】:

我有一个定义如下的实体。我的是一个 spring data jpa 应用程序。

我使用的是 Spring Boot 版本 1.5.4.RELEASE

当我使用 createDttm 从控制器调用服务时

cretDttm=2019-06-11T11:08:03.520808

它正在保存/更新为 2019-06-11 11:08:03.520000。它正在丢弃本地日期时间的最后 3 位数字。任何修复相同问题的指针。

@Setter
@Getter
@NoArgsConstructor
@Entity
@ToString
@Table(name = "FOO")
public class Foo 

  @Id
  @GeneratedValue
  @Column(name = "USER_ID")
  private BigInteger userId;

  @Column(name = "USER_NAME")
  private String userName;

  @Column(name = "CRET_DTTM", updatable = false)
  private LocalDateTime cretDttm;


@SpringBootApplication
@EntityScan(basePackageClasses = Application.class, Jsr310JpaConverters.class)
public class Application 
  public static void main(String[] args) 
    SpringApplication.run(Application.class, args);
  


更新: 默认的 Jsr310JpaConverters.class 没有转换器来支持 java.sql.Timestamp。我创建了https://thoughts-on-java.org/persist-localdate-localdatetime-jpa/#highlighter_743982 中提到的自定义转换器。注释与此处提到的相同 JPA Cannot Deserialize Java 8 LocalDateTime。它现在正在工作。谢谢。

【问题讨论】:

它保留毫秒,因此得到 3 位数。 【参考方案1】:

以下程序显示 LocalDateTime 保留到nanos(9 位):

public static void main(String[] args) 
    LocalDateTime dateTime = LocalDateTime.parse("2019-06-11T11:08:03.520808999");
    System.out.println(dateTime.toString());
    System.out.println(dateTime.getNano());

您能否检查您的数据库列类型,它是否保持到millis 精度或更多?我怀疑您的数据库正在截断micro 粒度(6 位到 3 位)。如果您的数据库支持microsnanos,请选择正确的数据类型。

【讨论】:

我的数据库是 DB2,列大小为 26。直到我调用 repsority.save(myentity) 才能看到。应该如何为 micros 选择一个? @NagendraBusam 存储此数据时间值的列的数据类型是什么? db 列是 TIMESTAMP 我在连接到 PostgreSQL(时间戳数据类型)的 Spring Boot 应用程序(LocalDateTime 数据类型)中运行了一个简单的测试,当我在输入中输入 nanos 时,它保存到微秒。请您检查一下不同的数据库,如 PostgreSQL、SQLite 或 Oracle 吗?我不确定 LocalDateTime 的 DB2 JDBC 驱动程序级别是否发生了某些事情。您是否也尝试使用java.sql.Timestamp(在保存之前将java.time.LocalDateTime转换为java.sql.Timestamp)作为ORM字段的数据类型? 默认的 Jsr310JpaConverters.class 没有转换器来支持 java.sql.Timestamp。我创建了thoughts-on-java.org/persist-localdate-localdatetime-jpa/… 中提到的自定义转换器。注释与此处提到的相同 ***.com/questions/42569951/…。它现在正在工作。谢谢。

以上是关于实体中的本地日期时间在保存时忽略给定格式的最后 3 位数字的主要内容,如果未能解决你的问题,请参考以下文章

格式化 BIRT 报告中的日期时间

在 Rails 和 PostgreSQL 中完全忽略时区

sqlite - 忽略 lag/lad 中的空值

RestKit 无法将 JSON 请求中格式为字符串的日期保存到我的本地数据库

SQL里怎么把日期截取为月份

Oracle基本数据类型存储格式浅析—日期类型(3)