首页 > 解决方案 > 为什么当日期在 1970-01-01 之后时 java.sql.Timestamp 返回负值

问题描述

Timestamp timestamp = Timestamp.valueOf("1970-01-01 01:00:00");
System.out.println(timestamp.getTime());

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

标签: javatimestampsql-timestamp

解决方案


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

将您的输入解析为 a LocalDateTime,因为它缺少时区指示符或与 UTC 的偏移量。将中间的空格替换为 aT以符合日期时间格式的 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 ) ;

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

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

360万


推荐阅读