如何创建没有时区的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 8, Java SE 9, Java SE 10, Java SE 11,以及更高版本-标准Java API的一部分,捆绑实现。
- 大多数java。time功能向后移植到Java 6;7在 ThreeTen-Backport 。
- Android bundle实现的更高版本的java。时间类。
- 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…。
Interval
、YearWeek
、YearQuarter
等。
标题>标题>