UTC 0日期部分中的Java sql时间戳出错

时间:2019-01-04 10:12:16

标签: java java-8

我正在使用以下代码来获取当前系统时间,该时间需要传递给某些sql查询

java.util.Date date = new java.util.Date();
long t = date.getTime();
java.sql.Timestamp sqlTimestamp = new java.sql.Timestamp(t);

log.info("Current Time:" + sqlTimestamp.toString());

现在我还需要获得UTC 0时间(不是GMT 0)

log.info(“当前时间:” + sqlTimestamp.toString());

当前时间:2019-01-04 15:04:50.735

我正在尝试遵循以下代码,但似乎无法正确获取日期部分

 log.info("Current UTC Time:" + new java.sql.Timestamp(Instant.now().atOffset( ZoneOffset.UTC ).toEpochSecond()).toString());

当前UTC时间:1970-01-19 02:36:36.299

请让我知道我需要什么纠正

4 个答案:

答案 0 :(得分:3)

您使用的是toEpochSecond()而不是toEpochMilli()

您的Timestamp构造函数的Javadoc

  

Timestamp(长时间)使用毫秒时间值构造一个Timestamp对象。

因此您可以使用Instant.now().toEpochMilli(),因为Instant.now()将以UTC返回您Instant

(当然,如果可能,请避免使用旧的日期API,请使用JDK8中的新的日期API)

答案 1 :(得分:3)

tl; dr

改用现代的 java.time 类。

Instant
.now()
.toString()
  

2019-01-23T01:23:45.123456789Z

java.time

您使用的是可怕的旧日期时间类,而这些类早已完全被 java.time 类所取代。

捕获当前时刻。

Instant instant = Instant.now() ;

以标准ISO 8601格式生成表示该时刻的文本。

String output = instant.toString() ;

如果中间的T困扰您,请更换它。但我鼓励您坚持使用严格的ISO 8601格式进行记录。

String outputModified = output.replace( "T" , " " ) ;
  

获取UTC 0时间(不是GMT 0)

实际上,对于常见的面向业务的应用程序,

UTC与GMT是相同的。

答案 2 :(得分:1)

首先避免使用类android:largeHeap="true" Date。代替Timestamp,将现代类型从java.time传递给您的SQL查询。根据JDBC驱动程序的详细信息和查询的要求,使用TimestampInstant(UTC偏移量为零)或OffsetDateTime

LocalDateTimeDate类存在设计问题,并且已经过时了。 Timestamp类可能非常令人困惑,对于将其解释为时间戳(如名称所示)还是一天中的日期和时间似乎并没有达成共识。幸运的是,从JDBC 4.2开始,您不再需要Timestamp

例如:

Timestamp

答案 3 :(得分:1)

为什么不能使用DateTimeFormatter

sqlTimestamp.toInstant().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS"))