获取JDBC&;Saxon日期时间数据作为ZonedDateTime对象

获取JDBC&;Saxon日期时间数据作为ZonedDateTime对象,jdbc,saxon,jsonpath,zoneddatetime,Jdbc,Saxon,Jsonpath,Zoneddatetime,我们有一组代码可以从JDBC、Saxon(XPath)、dom4j、jway json path(JPath)和OData获取日期时间作为日期对象。我们现在开始使用Java 1.8,我的第一个问题是,我现在是否要尝试获取任何数据,我以前将其作为日期对象获取,现在将其作为ZonedDateTime对象获取?还是我应该用别的东西 我的第二个问题是如何将来自JDBC、Saxon等的数据作为ZoneDateTime对象读取?tl;博士 永远不要使用遗留类,只使用java.time 当必须转换时,请使用

我们有一组代码可以从JDBC、Saxon(XPath)、dom4j、jway json path(JPath)和OData获取日期时间作为日期对象。我们现在开始使用Java 1.8,我的第一个问题是,我现在是否要尝试获取任何数据,我以前将其作为日期对象获取,现在将其作为ZonedDateTime对象获取?还是我应该用别的东西

我的第二个问题是如何将来自JDBC、Saxon等的数据作为ZoneDateTime对象读取?

tl;博士
  • 永远不要使用遗留类,只使用java.time
  • 当必须转换时,请使用添加到旧类的新方法进行转换
  • 从JDBC4.2开始,与数据库交换java.time对象,不要使用字符串或
    java.sql
    类型
  • 在UTC中完成大部分工作。调整到仅用于演示的时区
  • 当以文本形式传递日期时间值时,请使用ISO 8601格式
  • 有关详细信息,请搜索堆栈溢出

避免遗留日期时间类 非常麻烦的旧日期时间类,如
java.util.date
java.util.Calendar
java.text.SimpleDateFormat
java.sql.Timestamp
java.sql.date
都被java.time类完全取代再也不用碰那些糟糕的旧课程了。

时间类已经与Java8和更高版本捆绑在一起好几年了。他们已经证明自己是一个可靠的、行业领先的约会时间工作框架。他们受到了从优秀项目(现在处于维护模式)中吸取的经验教训的启发。因此java.time类具有“古老的灵魂”,而不是一些有限的“1.0”草稿

转化 为了与尚未更新到java.time类的旧代码进行互操作,您可以轻松地在遗留类和现代类之间来回转换。对于转换,请查看添加到旧类的新方法。阅读问题,如了解更多信息

数据库 从和以后,您可以直接与数据库交换java.time对象。无需再次将设计糟糕的java.sql类用于日期时间值

通常,最好使用
Instant
作为类似于SQL标准
带时区的时间戳的列中的值

myPreparedStatement.setObject( … , instant ) ;
和检索

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ISO 8601 在JVM之外交换日期时间值时,使用标准格式序列化为文本。这些格式被设计成有用和实用的,易于机器解析,易于跨文化阅读

在解析/生成字符串时,java.time类默认使用ISO 8601格式。
ZonedDateTime
类通过明智地在方括号中添加区域名称来扩展标准

地带 以前作为日期对象获取的数据现在作为ZonedDateTime对象获取

java.util.Date
类直接替换为
Instant
。两者都代表UTC中的一个时刻。现代类解析为纳秒而不是毫秒

Instant instant = myJavaUtilDate.toInstant() ;  // Convert from legacy class to modern. 
在诸如Postgres之类的数据库中,带有时区的
TIMESTAMP类型的列实际上没有保存其时区。相反,数据库使用传入值传递的任何偏移量或区域调整为UTC。生成的UTC时刻将保存到数据库中,原始分区/偏移将被丢弃。如果需要原始分区/偏移,则必须手动将其保存到额外的列中

因此,通常最好在时间线上用数据库传递和获取
Instant
对象一段时间

要了解不在时间线上的日期时间的概念,请搜索
LocalDateTime
class,并阅读类似此问题的帖子

请注意,SQL标准很少涉及日期时间处理这一棘手的话题。它定义了一些类型,但很少涉及行为。因此,数据库在其实现上差异很大。请务必进行研究和实验,以验证您对数据库和驱动程序的理解

从JDBC、Saxon等读取数据作为ZonedDateTime对象

通常,最佳做法是在UTC工作。这意味着
Instant
类而不是
ZonedDateTime

如果收到
日期
,则转换为
即时
,如上所示

通常,您希望在UTC中完成业务逻辑、存储、交换、日志记录和跟踪/调试。仅在业务需求要求或向用户演示时应用时区

有了
即时
,您可以通过指定时区来调整特定地区的人们使用的挂钟时间。应用
ZoneId
以获取
zoneDateTime

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

搜索堆栈溢出 你的问题实际上是许多其他问题的重复,例如。我建议您在堆栈溢出中搜索各种java.time类名。你会学到很多,因为已经发布了大量的问题和答案

兼容库 许多Java库已经更新,可以使用Java.time类型

检查您可能正在使用的库的最新版本,并阅读它们的文档以了解添加的支持

如果不直接支持,接受转换器/格式化程序/插件的库可能已经编写了一些java.time库。搜索它们,或在姐妹网站上询问:


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

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

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;