创建没有时区的时间戳

13

如何创建一个没有时区的 java.sql.timestamp(我得到了 2007-09-23T10:10:10Z,但我想要的是 2007-09-23T10:10:10)。

我尝试:

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

但是在调试中我发现cdate的值为2007-09-23T10:10:10.000+0100而不是2007-09-23T10:10:10

2个回答

16

时间戳(Timestamp)没有时区信息。当你将时间戳显示为字符串时,它会显示一个时间并提及时区,否则你就无法知道代表的是哪个时刻。它选择使用默认时区(你的时区),因为这样你最熟悉。

仅仅说“现在是12:00:00”是没有意义的,只有说“现在是你所在时区的12:00:00”才有意义。但是,时间戳只包含某一瞬间的时间点,你可以使用日期格式(DateFormat)来将其显示成任何你想要的时区的时间。

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


这意味着没有办法说我不想要默认时区(或者使用日期的相同方式)吗?我打算忽略“23T10:10:10Z”中的Z。 - JMarques
使用DateFormat,设置其时区和模式为所需的值,解析您的日期/时间字符串,并使用Date中的毫秒数实例化Timestamp。要显示时间戳,请实例化DateFormat,将其时区和模式设置为所需的值,并格式化时间戳。 - JB Nizet

5

简述

...我能否创建一个没有时区的java.sql.timestamp…

不行,您需要使用其他类,可以尝试使用java.time.LocalDateTime代替。

细节

java.sql.Timestamp并不适合这个需求。它表示UTC的一瞬间,精度为纳秒。

如果您需要一个带有时间但不考虑时区或UTC偏移量的日期(即不是确切的某一时刻),请使用适当的类。

另外,java.sql.Timestamp是一个设计非常糟糕的老旧类,多年前就被java.time.Instant(始终处于UTC)或者设置为UTC偏移量的类java.time.OffsetDateTime所取代。

LocalDateTime

如果您需要一个不考虑任何时区或UTC偏移量概念的日期和时间,请使用适当的类——LocalDateTime

如上所述,这意味着这个类不是一个瞬间,不是时间轴上的一个点,并且不应该被用来追踪事件在某个地方发生的实际时间点。
在符合 SQL 标准的数据库中,如 Postgres ,请使用数据类型为 TIMESTAMP WITHOUT TIME ZONE 的列(不要使用 WITH 类型)。
LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;

And…

myPreparedStatement.setObject( … , ldt ) ;

关于 java.time

java.time 框架已经内置于 Java 8 及以后版本。这些类替代了麻烦的旧式遗留日期时间类,如 java.util.DateCalendarSimpleDateFormat

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

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

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

如何获取 java.time 类?

ThreeTen-Extra 项目扩展了 java.time 的附加类。该项目是 java.time 可能未来增加的潜在试验场。您可能会在这里找到一些有用的类,例如 Interval, YearWeek, YearQuarter更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接