Java 为Timestamp.valueOf获取不同的值

Java 为Timestamp.valueOf获取不同的值,java,scala,Java,Scala,我正在尝试通过执行以下操作获取2018-09-04 13:43:32.922000的时间戳值 Timestamp.valueOf(“2018-09-04 13:43:32.922000”) 我的预期产出是2018-09-04 13:43:32.922 但是我得到2018-09-04 01:13:32.922 这可能是由于不同的时区,因为我在印度的团队得到了确切的结果,但我在加利福尼亚得到了不同的结果。 建议可以解决此问题的更改。我不认为问题是由于不同的时区造成的。只是你得到的输出是24小时格式的

我正在尝试通过执行以下操作获取2018-09-04 13:43:32.922000的时间戳值
Timestamp.valueOf(“2018-09-04 13:43:32.922000”)

我的预期产出是2018-09-04 13:43:32.922

但是我得到2018-09-04 01:13:32.922

这可能是由于不同的时区,因为我在印度的团队得到了确切的结果,但我在加利福尼亚得到了不同的结果。
建议可以解决此问题的更改。

我不认为问题是由于不同的时区造成的。只是你得到的输出是24小时格式的,需要转换成12小时格式。请参阅将时间转换为12小时格式。

tl;博士 java.time 建议可以解决此问题的更改

切勿使用
java.sql.Timestamp

该类的许多缺陷之一是,在解析时无法解释其行为。您的JVM当前的默认时区似乎正在被静默地应用,并进行了一些调整。但这个问题还没有定论

多年前,随着JSR 310的采用,这个设计糟糕的类被现代的java.time类所取代,特别是
Instant
OffsetDateTime

将输入字符串更改为标准格式,用“<代码> t>代码>替换中间的空间。

String input = "2018-09-04 13:43:32.922000".replace( " " , "T" ) ;
您的输入是否旨在表示一个瞬间,即零的偏移量?如果是,请附加一个
Z
(发音为Zulu)

Instant
类表示UTC中的一个时刻,根据定义总是UTC

Instant instant = Instant.parse( input ) ;
您可以选择接受
即时
对象

myPreparedStatement.setObject( instant ) ;
如果您的JDBC驱动程序不支持
Instant
,请使用
OffsetDateTime
。JDBC4.2及更高版本中需要支持

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ; 
myPreparedStatement.setObject( odt ) ;
请注意,JVM在运行时的当前默认时区是如何无关的,对上面的代码没有影响


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

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

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

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

从哪里获得java.time类

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

    • 对于早期的Android(不要使用
      Timestamp.valueOf
      。使用
      DateTimeFormatter
      它允许指定数据的格式和时区。差异为12小时30分钟,涉及印度(偏移量+05:30)很有可能这确实是一个时区问题。过时的
      Timestamp
      类不是时区的朋友。没有代码我们无法回答。请问,你能不能?有可能在一台机器上我得到24小时格式,而在另一台机器上,我得到12小时格式?如果你看到的话,差别是12小时30分钟。所以,我是请相信情况并非如此,否则会有12小时的差异。
      Timestamp.toString
      始终以24小时格式打印。对我来说工作完美无瑕。did“Timestamp.from(Instant.parse(“2018-09-04T08:13:32.922000Z”)”
      myPreparedStatement.setObject( instant ) ;
      
      OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ; 
      myPreparedStatement.setObject( odt ) ;