如何创建一个没有时区的 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
时间戳(Timestamp)没有时区信息。当你将时间戳显示为字符串时,它会显示一个时间并提及时区,否则你就无法知道代表的是哪个时刻。它选择使用默认时区(你的时区),因为这样你最熟悉。
仅仅说“现在是12:00:00”是没有意义的,只有说“现在是你所在时区的12:00:00”才有意义。但是,时间戳只包含某一瞬间的时间点,你可以使用日期格式(DateFormat)来将其显示成任何你想要的时区的时间。
注意:Timestamp.valueOf("2010-10-23 12:05:16");
表示“在默认时区下创建一个具有给定时间的时间戳”。
...我能否创建一个没有时区的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
。
TIMESTAMP WITHOUT TIME ZONE
的列(不要使用 WITH
类型)。LocalDateTime ldt = myResultSet.getObject( … , LocalDateTime.class ) ;
And…
myPreparedStatement.setObject( … , ldt ) ;
java.time 框架已经内置于 Java 8 及以后版本。这些类替代了麻烦的旧式遗留日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
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
和 更多。