当前位置: 首页 > 知识库问答 >
问题:

使用Java8LocalDate进行Hibernate

闻人花蜂
2023-03-14

我的要求是存储所有日期

这是不是正确的LocalDate

如果没有,我应该回到使用好的旧(或遗留?)Date

或者我应该使用Java 8的即时?如果使用Instant,是否可以只存储日期部分而不存储时间?

数据库是MySQL

共有3个答案

朱宏爽
2023-03-14

作为新Date API的一部分,他们将日期类型进行了拆分。包含时区的正确类是ZoneDateTime

// Get the current date and time
      ZonedDateTime date1 = ZonedDateTime.parse("2007-12-03T10:15:30+05:30[Asia/Karachi]");
      System.out.println("date1: " + date1);

      ZonedDateTime zonedDateTime = ZonedDateTime.now();
      System.out.println("Zoned Date Time: " + zonedDateTime);

      ZoneId id = ZoneId.of("Europe/Paris");
      System.out.println("ZoneId: " + id);

      ZoneId currentZone = ZoneId.systemDefault();
      System.out.println("CurrentZone: " + currentZone);

印刷品:

date1: 2007-12-03T10:15:30+05:00[Asia/Karachi]
Zoned Date Time: 2017-04-18T11:36:09.126-04:00[America/New_York]
ZoneId: Europe/Paris
CurrentZone: America/New_York
陈知
2023-03-14

还是应该使用Java8的Instant?如果使用Instant,是否可以只存储日期部分,而不存储时间?

Instant应适用于大多数操作。

hibernate-java8添加到pom中。xml支持Java 8时间API:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-java8</artifactId>
    <version>${version.hibernate}</version>
</dependency>

然后您可以对Hibernate实体字段使用LocalDateLocalDateTimeInstant。您需要删除@Temporal(TemporalType. TIMESTAMP)

我的要求是存储所有日期

这是LocalDate吗

您可以在配置代码中的某个位置设置默认JVM时区:

@PostConstruct
void setUTCTimezone() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

然后在代码中操作UTC时间。

要在DTO中使用Java 8日期类型,需要添加JSR310JPA转换器:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

和:

@EntityScan(basePackageClasses = { Application.class,    Jsr310JpaConverters.class })
SpringBootApplication
public class Application { … }

更多选择:

  • 强制Java时区为GMT/UTC
  • 如何设置java时区
  • 如何正确设置JVM时区
高皓
2023-03-14

“本地…”类型故意没有时区的概念。因此,它们并不代表时间线上的某个时刻。LocalDateTime表示一个模糊的可能时刻范围,但在指定偏移量或时区之前没有实际意义。这意味着应用一个ZoneId来获得一个ZoneDateTime

例如,说今年的圣诞节从12月25日的第一个时刻开始,我们说:

LocalDateTime ldt = LocalDateTime.of( 2017 , 12 , 25 , 0 , 0 , 0 , 0 );

但午夜钟声在东方比西方来得早。

这就是为什么精灵后勤部门绘制出圣诞老人的路线图,从太平洋的基里巴斯开始,这是世界上最早的时区,比UTC早14小时。在那里交货后,他们将圣诞老人向西送至新西兰等地,在午夜过后举行婚礼。之后,他们将前往亚洲参加午夜派对。然后是印度,等等,几个小时后到达欧洲进入午夜,再过几个小时到达北美东海岸进入午夜。所有这些地方在不同的时刻都经历了相同的LocalDateTime,每个交付都由不同的ZoneDateTime对象表示。

所以…

  • 如果您想记录25日午夜后开始的圣诞节概念,请使用LocalDateTime并写入TIMESTAMP WITHOUT TIME ZONE类型的数据库列。
  • 如果您想记录Santa每次送货的确切时刻,请使用ZonedDateTime并写入TIMESTAMP AND TIME ZONE类型的数据库列。

关于第二个要点,请注意,几乎每个数据库系统都会使用区域信息将日期时间调整为UTC,并存储该UTC值。有些人还保存了分区信息,但有些人(如Postgres)在使用分区信息调整到UTC后会丢弃分区信息。所以“有时区”有点用词不当,真正的意思是“尊重时区”。如果你想记住原来的区域,你可能需要把它的名字存储在一个单独的列中。

使用本地...类型的另一个原因是为了将来的约会。政客们喜欢经常改变他们管辖范围内的时区。他们喜欢采用夏令时。比如改变夏令时转换的日期。他们喜欢放弃夏令时的采用。他们喜欢重新定义他们的时区,改变边界。他们喜欢重新定义他们的UTC偏移量,有时大约15分钟。他们很少提前通知,在一两个月的警告下做出这样的改变。

因此,要预约明年或六个月的体检,时区定义无法预测。因此,如果你想预约上午9点,你应该使用LocalTimeLocalDateTime记录在不带时区的时间戳类型的数据库列中。否则,上午9点的预约,如果被划分为DST切换延迟的区域,可能会出现在上午8点或上午10点。

生成投影计划时,您可以将时区(ZoneId)应用于那些“本地”(未分区)值以创建ZonedDateTime对象。但不要依赖那些时间太远的政客可能会通过更改区域来破坏他们的意义。

提示:DST和时区的频繁更改意味着您必须使时区数据库保持最新。在您的主机操作系统、JVM中,或者在您的数据库系统(如Postgres)中,都有大量的数据。这三种情况都应该经常更新。有时,这些区域的变化比这些产品的计划更新周期要快,比如土耳其去年决定在仅提前几周通知的情况下继续使用DST。因此,您可能偶尔需要手动更新这些数据文件。Oracle提供了一个工具来更新其Java实现的数据。

处理精确时刻的一般最佳实践是在UTC中跟踪它们。仅在必要时应用时区,例如在向用户展示时,他们希望在自己的狭隘时区中看到值。java.time,Instant类表示时间线中的一个时刻。在UTC中,分辨率为纳秒。

Instant instant = Instant.now() ;  // Current moment on the timeline in UTC.
ZonedDateTime zdt = instant.atZone( z ) ;  // Assign a time zone to view the same moment through the lens of a particular region’s wall-clock time.
Instant instant = zdt.toInstant();  // revert back to UTC, stripping away the time zone. But still the same moment in the timeline.

顺便说一下,符合JDBC 4.2及更高版本的驱动程序可以直接处理java。时间类型通过:

  • PreparedStatement::setObject
  • ResultSet::getObject

奇怪的是,JDBC 4.2规范不需要支持两种最常见的java。时间类型:Instant

尽可能避免旧的遗留数据类型,例如java.util.Datejava.sql.Timestamp。它们设计不佳、令人困惑且有缺陷。

请理解,这四个都是UTC时间线上某个时刻的表示:

  • 现代的
  • java。util。日期
  • java。sql。时间戳

如果您想要一个只包含日期的值,而不包含一天中的时间和时区,请使用java。时间LocalDate。这个类取代了java。sql。日期

至于特定的数据库,请注意,SQL标准几乎没有涉及日期时间类型及其处理的主题。此外,各种数据库在支持日期时间功能方面差异很大,我的意思是差异很大。有些几乎没有支持。有些将SQL标准类型与专有类型混合在一起,这些类型要么早于标准类型,要么旨在作为标准类型的替代方案。此外,JDBC驱动程序在将日期时间值封送到/从数据库中的行为方面存在差异。一定要学习留档和练习,练习,练习。

 类似资料:
  • 问题内容: 在过去的两年中,我一直在编写Java,现在,我开始用python(另外)进行编写。 问题是,当我查看我的Python代码时,似乎有人试图将Java代码转换为python格式,但结果却很糟糕,因为- python不是Java。 关于如何摆脱“用Python编写Java”模式的任何技巧? 谢谢! 问题答案: 您可能会考虑将自己沉浸在Python范例中。最好的方法是首先了解他们的知识,然后通

  • 问题内容: 我有一个测试,可以从数据提供者那里接收数据。我希望此测试与数据提供者的不同值并行运行。 我尝试了类似的方法: } 我收到的输出是: 你好:10 你好:12 你好:17 你好:11 你好:16 你好:14 你好:13 你好:15 产生10个线程,而我在线程池大小中指定5个。您能否告诉我们必须在上述代码段中添加哪些内容来控制数据提供程序线程池的大小。 问题答案: 您需要使用。在和不需要的值

  • 如何用vscode选择多行? 在Visual Studio上,您可以按左alt键并选择多行,但它不适用于vscode。

  • 我正在使用DataTables,并将这个有点尴尬的Javascript拼凑在一起,以允许行和列高亮显示。它基于本页的示例(http://datatables.net/release-datatables/examples/api/highlight.html ). 下面是dataTable配置的相关部分: 服务器上的模板代码插入了一些常量。这是列数。以下是DataTables调试输出:http:/

  • 问题内容: NumPy / SciPy或相关库中是否有类似Matlab的函数? 以供参考。Procrustes分析的目的是对齐2组点(换句话说,是2个形状),以通过消除缩放,平移和旋转扭曲分量来最小化它们之间的平方距离。 Matlab中的示例: NumPy中的相同任务: 注意:我只对对齐的形状感兴趣,因为平方误差(在Matlab代码中可变)很容易从2个形状中计算出来。 问题答案: 我不知道Pyth

  • 问题内容: 我知道如何在AngularJS中创建 视图 条件,该条件将根据条件显示或隐藏dom元素: 但是如何创建确定是否渲染div 的 渲染 条件? 问题答案: 针对angularjs 1.1.5及更高版本用户的更新(在1.0.7中不受支持): 相关提交:https : //github.com/angular/angular.js/commit/2f96fbd17577685bc013a4f7