是否将java.sql.Timestamp转换为java 8 ZoneDateTime?
将Joda time迁移到Java 8 乔达: 迁移到Java8 这是我的密码;它确实编译;我怀疑它是否有效:是否将java.sql.Timestamp转换为java 8 ZoneDateTime?,java,sql,java-8,java-time,zoneddatetime,Java,Sql,Java 8,Java Time,Zoneddatetime,将Joda time迁移到Java 8 乔达: 迁移到Java8 这是我的密码;它确实编译;我怀疑它是否有效: ZonedDateTime.ofInstant(rs.getTimestamp("columnName").toLocalDateTime().toInstant(ZoneOffset.UTC),ZoneId.of("UTC"))); 在某些情况下,日期是错误的。有什么建议吗?请使用以下建议: rs.getTimestamp("columnName").toInstant()
ZonedDateTime.ofInstant(rs.getTimestamp("columnName").toLocalDateTime().toInstant(ZoneOffset.UTC),ZoneId.of("UTC")));
在某些情况下,日期是错误的。有什么建议吗?请使用以下建议:
rs.getTimestamp("columnName").toInstant()
.atZone(ZoneId.[appropriate-zone-ID-here])
您需要使用适合该区域的工具(您可以尝试使用)
有关各种Java时间API之间差异的更多详细信息,请参阅。tl;博士
若要跟踪历史中的某个时刻,请使用作为类成员变量的类型。具体来说,这一时刻被视为一天中的日期和时间
使用,捕捉当前时刻
UserObject user = new UserObject() ;
user.setCreatedAt( Instant.now() ) ;
用法,从数据库填充值
UserObject user = new UserObject() ;
Instant instant = myResultSet.getObject( "when_created" , Instant.class ) ;
user.setCreatedAt( instant ) ;
不需要支持(UTC中的一瞬间)。如果您的驱动程序不支持该类,请切换到所需的
UserObject user = new UserObject() ;
OffsetDateTime odt = myResultSet.getObject( "when_created" , OffsetDateTime.class ) ;
user.setCreatedAt( odt.toInstant() ) ; // Convert from an `OffsetDateTime` (for any offset-from-UTC) to `Instant` (always in UTC).
呈现给用户,针对用户界面进行本地化
user // Your business object.
.getCreatedAt() // Returns a `Instant` object.
.atZone( // Adjust from UTC to a time zone. Same moment, same point on the timeline, different wall-clock time.
ZoneId.of( "Pacific/Auckland" ) // Specify the user’s desired/expected time zone.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` representing the value of date-time object.
DateTimeFormatter.ofLocalizedDateTime(
FormatStyle.FULL // Specify how long or abbreviated the string.
)
.withLocale( // Specify `Locale` to determine human language and cultural norms for localization.
Locale.CANADA_FRENCH
)
) // Returns a `String`.
请注意,这与时区无关,这是一个正交问题。上面的代码可能适用于来自中国的商务人士。她想看看周围人使用的挂钟时间,但她更喜欢用母语法语阅读它的文字显示。时区和地区问题最好只留给演示;通常,最好在代码的其余部分使用UTC。因此,我们将成员变量createdAt
定义为Instant
,其中Instant
的定义始终为UTC
避免java.sql.Timestamp
,以及java.sql.Timestamp
、java.sql.Date
和java.util.Date
都是非常麻烦的旧日期时间类的一部分,多年前被java.time类取代Calendar
- 正如项目站点首页所述,too现在被java.time类取代
UserObject user = new UserObject() ;
Instant instant = myResultSet.getObject( "when_created" , Instant.class ) ;
user.setCreatedAt( instant ) ;
Instant
使用Instant
class将当前时刻发送到数据库。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)
和检索
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZoneDateTime
要通过某个特定地区(时区)的人们使用的挂钟时间来观察同一时刻,请应用a来获得a
LocalDateTime
不是一个时刻
.toLocalDateTime()
在表示特定时间点时,不要使用LocalDateTime
类。该课程故意缺乏时区或UTC偏移的概念。因此,它不能代表一个时刻,也不是时间线上的一个点。这是一个关于26-27小时(时区范围)内潜在时刻的模糊概念
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 该项目现已启动,建议迁移到类 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- 带来了一些小功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- Android(26+)的更高版本捆绑了java.time类的实现
- 对于早期的Android(这似乎有效:-
ZonedDateTime.ofInstant(rs.getTimestamp("columnname").toInstant(), ZoneId.of("UTC"))
什么是数据库列数据类型?您能否给出一个正确值的示例,如SQL查询中所示,然后是
?然后是一个错误日期的示例,如在数据库中,正确的ZonedDateTime
,以及实际结果如何不同?“在某些情况下,日期是错误的”坦白地说,这是非常模糊的。抱歉,这似乎起作用了:ZonedDateTime.ofInstant(rs.getTimestamp(“column”).toInstant(),ZoneId.of(“UTC”))Holy smokes,感谢弯刀在Java+JDBC时间丛林中导航!ZonedDateTime
Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZoneId z = ZoneId.of( "Africa/Tunis" ) ; ZonedDateTime zdt = instant.atZone( z ) ;
ZonedDateTime.ofInstant(rs.getTimestamp("columnname").toInstant(), ZoneId.of("UTC"))