Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否将java.sql.Timestamp转换为java 8 ZoneDateTime?_Java_Sql_Java 8_Java Time_Zoneddatetime - Fatal编程技术网

是否将java.sql.Timestamp转换为java 8 ZoneDateTime?

是否将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()

将Joda time迁移到Java 8

乔达:

迁移到Java8

这是我的密码;它确实编译;我怀疑它是否有效:

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
    Calendar
    都是非常麻烦的旧日期时间类的一部分,多年前被java.time类取代
  • 正如项目站点首页所述,too现在被java.time类取代
java.time 到及以后,我们可以直接与数据库交换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
      ,以及实际结果如何不同?“在某些情况下,日期是错误的”坦白地说,这是非常模糊的。抱歉,这似乎起作用了:ZonedDateTime.ofInstant(rs.getTimestamp(“column”).toInstant(),ZoneId.of(“UTC”))Holy smokes,感谢弯刀在Java+JDBC时间丛林中导航!
      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"))