Java 创建不带时区的时间戳

Java 创建不带时区的时间戳,java,jdbc,timezone,timestamp,Java,Jdbc,Timezone,Timestamp,如何创建一个没有时区的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时间戳没有时区。当您将时间戳显示为字符串时,它会显示一个时间并提及时区

如何创建一个没有时区的
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
时间戳没有时区。当您将时间戳显示为字符串时,它会显示一个时间并提及时区,因为否则您无法知道它代表什么时间。它选择使用默认时区(您的),因为这是您最熟悉的时区

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

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

tl;博士 …我可以创建一个没有时区的java.sql.timestamp吗

不,你不能。错班了。改用
java.time.LocalDateTime

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

如果您想要一个日期包含一天中的时间,而不考虑时区或UTC的偏移量(因此,不是一个时刻),请使用另一个适合此目的的类

顺便说一句,
java.sql.Timestamp
是一个设计糟糕的旧类,多年前被
java.time.Instant
(始终使用UTC)或
java.time.OffsetDateTime
类取代,如果设置为UTC偏移量

LocalDateTime
对于一天中没有任何时区或UTC偏移概念的日期,正确的类别为

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

不带时区的时间戳
在符合SQL标准的数据库中,例如,使用不带时区的数据类型为
TIMESTAMP的列(而不是带
类型的

而且

myPreparedStatement.setObject( … , ldt ) ;

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • Java9添加了一些次要功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(这意味着没有办法说a不想要默认时区(或者使用日期)我假装忽略了“23T10:10:10Z”中的Z。使用DateFormat,将其时区和模式设置为所需的时区和模式,解析日期/时间字符串,并用从日期算起的毫秒数实例化时间戳。若要显示时间戳,请实例化DateFormat,将其时区和模式设置为所需的时区和模式,然后格式化时间戳。
      myPreparedStatement.setObject( … , ldt ) ;