创建不带timeZone的Timestamp



如何创建没有时区的java.sql.timestamp(我得到2007-09-23T10:10:10Z,我假装2007-09-23T10:10:10)

I try:

Timestamp timestamp = Timestamp.valueOf("2007-09-23 10:10:10");

但在调试中我看到候选是2007-09-23T10:10:10.000+0100而不是2007-09-23T10:10:10

时间戳没有时区。当您将时间戳显示为String时,它会显示时间并提到时区,否则您就无法知道它表示的时间。它选择使用默认时区(您的),因为这是您最熟悉的。

说,现在是12:00:00并不意味着什么。说现在是你所在时区的12:00:00是有意义的。但是时间戳只包含一个瞬间。您可以使用DateFormat在任何时区显示此时刻。

注意:Timestamp.valueOf("2010-10-23 12:05:16");表示"在默认时区中使用给定时间创建时间戳"。

br

我可以创建一个不带时区的java.sql.timestamp吗?

不,你不能。错误的类。用java.time.LocalDateTime代替。

<标题> 详细信息

java.sql.Timestamp是一个错误的类。它表示UTC中的一个时刻,分辨率为纳秒。

如果你想要一个与时区或utc偏移量无关的日期(因此,而不是 a moment),请使用另一个适合用途的类。

顺便说一下,java.sql.Timestamp是一个设计糟糕的旧类,多年前被java.time.Instant类(总是在UTC)或java.time.OffsetDateTime类(如果设置为UTC的偏移量)所取代。

LocalDateTime

带时间(time-of-day)的日期,没有时区或utc偏移量的概念,合适的类是LocalDateTime

如上所述,这意味着该类不是一个时刻,不是时间轴上的一个点,并且不应该用于跟踪事件在某个地方发生的实际时间点。

TIMESTAMP WITHOUT TIME ZONE

在符合sql标准的数据库(如Postgres)中,使用数据类型为TIMESTAMP WITHOUT TIME ZONE的列(而不是WITH类型)。

LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

myPreparedStatement.setObject( … , ldt ) ;

<标题>对 java.time

java。time框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date, Calendar, &SimpleDateFormat .

Joda-Time项目,现在处于维护模式,建议迁移到java。时间类。

要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。

可以交换java。Time 直接与数据库关联。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java。时间类?

  • Java SE 8Java SE 9Java SE 10Java SE 11,以及更高版本-标准Java API的一部分,捆绑实现。
    • Java 9增加了一些小的特性和修复。
  • Java SE 6Java SE 7
    • 大多数java。time功能向后移植到Java 6;7在 ThreeTen-Backport
  • Android
    • Android bundle实现的更高版本的java。时间类。
    • 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…
  • ThreeTen-Extra项目扩展了java。有额外课程的时间。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等。

    相关内容

    • 没有找到相关文章

    最新更新