创建没有timeZone的时间戳

JMa*_*ues 7 java timezone timestamp jdbc

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

我尝试:

Timestamp timestamp = Timestamp.valueOf("2007-09-23 10:10:10");
Run Code Online (Sandbox Code Playgroud)

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

JB *_*zet 14

时间戳没有时区.当您将时间戳显示为字符串时,它会显示时间并提及时区,因为否则您无法知道它代表的时间.它选择使用默认时区(你的),因为这是你最熟悉的时区.

说,它是12:00:00并不意味着什么.在你的时区说它是12:00:00意味着什么.但时间戳只包含一个及时的时间.您可以使用DateFormat在任何时区中及时显示此瞬间.

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


Bas*_*que 5

太长了;博士

\n\n
\n

\xe2\x80\xa6 我可以创建一个没有时区的 java.sql.timestamp \xe2\x80\xa6

\n
\n\n

你不能。上错课了。java.time.LocalDateTime代替使用。

\n\n

细节

\n\n

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

\n\n

如果您想要一个带有当天时间的日期,而不考虑时区或与 UTC 的偏移量(所以,时刻),请使用另一个适合目的的类。

\n\n

顺便说一句\xe2\x80\xa6 这java.sql.Timestamp是一个糟糕的旧类,设计得很糟糕,几年前就被该类取代java.time.Instant(始终采用 UTC),或者java.time.OffsetDateTime如果设置为 UTC 的偏移量。

\n\n

LocalDateTime

\n\n

具有时间且没有任何时区概念或与 UTC 的偏移量的日期的正确类是LocalDateTime

\n\n

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

\n\n

TIMESTAMP WITHOUT TIME ZONE

\n\n

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

\n\n
LocalDateTime ldt = myResultSet.getObject( \xe2\x80\xa6 , LocalDateTime.class ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

和\xe2\x80\xa6

\n\n
myPreparedStatement.setObject( \xe2\x80\xa6 , ldt ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

关于java.time

\n\n

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

\n\n

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

\n\n

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

\n\n

您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序。不需要字符串,不需要类。java.sql.*

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n