【问题标题】:why java.sql.Timestamp return negative value when the date is after 1970-01-01为什么当日期在 1970-01-01 之后时 java.sql.Timestamp 返回负值
【发布时间】:2020-04-21 10:17:31
【问题描述】:
Timestamp timestamp = Timestamp.valueOf("1970-01-01 01:00:00");
System.out.println(timestamp.getTime());

知道这段代码返回 -25200000 吗? 我认为 1970-01-01 00:00:00 之后的时间会是积极的。

【问题讨论】:

  • I thought time after 1970-01-01 00:00:00 will be positive GMT 之后的一切都是积极的。由于您正在解析没有任何区域信息的 DateTime,因此您获得的结果将取决于您运行它的计算机的时区。 (因为它将解释日期/时间以引用系统的当前区域)
  • 我明白了,我似乎不能在字符串中添加一个 Z,像这样:“1970-01-01 01:00:00 Z”它会抛出异常。任何想法? @OHGODSPIDERS

标签: java timestamp sql-timestamp


【解决方案1】:

您正在使用一个糟糕的日期时间类,该类在几年前被 JSR 310 中定义的现代 java.time 类所取代。切勿使用java.sql.Timestamp

将您的输入解析为 LocalDateTime,因为它缺少时区指示符或与 UTC 的偏移量。将中间的空格替换为 T 以符合日期时间格式的 ISO 8601 标准。

String input = "1970-01-01 01:00:00".replace( " " , "T" ) ;
LocalDateTime ldt = LocalDateTime.parse( input ) ;

显然,您的意思是代表 UTC 中的一个时刻。应用偏移量以获得OffsetDateTime

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;

获取自 UTC 1970 年第一刻的纪元参考以来的毫秒数。

long millis = odt.toInstant().toEpochMilli() ;

3600000

【讨论】:

  • 谢谢。之所以使用that是因为hive用that来表示时间戳,jdbc用它
  • @Bargitta 从 JDBC 4.2 开始,我们可以使用 java.time 对象代替 java.sql.Timestamp。特别是OffsetDateTime,以及可选的InstantZonedDateTime。您可以通过调用添加到旧类的新转换方法来从Timestamp 来回转换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2013-07-23
  • 2023-03-03
  • 1970-01-01
  • 2012-02-17
相关资源
最近更新 更多