首页 > 解决方案 > 将 java.sql.Date 转换为 LocalDateTime

问题描述

我有一个java.sql.Date对象,想把它转换成一个java.time.LocalDateTime对象。

为了比较,我可以使用以下方法进行类似的转换java.util.Date

java.util.Date utilDate = new java.util.Date(sqlDate.getTime());
System.out.println("date with time: " + utilDate);

这个答案对我不起作用,因为我java.sql.Date没有getTimestamp方法。

作为参考,这个问题解决了相反的转变。

标签: javadate

解决方案


您正在使用糟糕的日期时间类,这些类在几年前被JSR 310 中定义的现代java.time类所取代。

  • 不使用java.sql.Date
  • 不使用java.util.Date
  • 不使用java.sql.Timestamp
  • 不使用java.util.Calendar

仅使用java.time类。

要与数据库交换日期时间值,请使用 JDBC 4.2 或更高版本。

该类java.sql.Date假装代表一个仅限日期的值。

如果递给您一个java.sql.Date对象,请立即将其转换为java.time.LocalDate. 使用toLocalDate添加到该旧类的新方法。

LocalDate localDate  = myJavaSqlDate.toLocalDate() ;

你要了一个java.time.LocalDateTime对象。您有必要的日期部分。现在您需要分配时间部分。

LocalTime localTime = LocalTime.of( 15 , 30 );

结合。

LocalDateTime localDateTime = LocalDateTime.of( localDate, localTime ) ;

ALocalDateTime本质上是模棱两可的。日本的下午 3:30 与摩洛哥的下午 3:30 不同。

要确定一个时刻,时间轴上的一个特定点,请将您LocalDateTime放在时区的上下文中。你得到一个ZonedDateTimeObject.

ZoneId zoneId = ZoneId.of( "Asia/Tokyo" ) ;
ZonedDateTime zonedDateTime = localDateTime.atZone( zoneId ) ;

要查看 UTC 中看到的那个时刻,与 UTC 的偏移量为零小时-分钟-秒,请提取一个Instant.

Instant instant = zonedDateTime.toInstant() ;

推荐阅读