我正在使用以下代码来获取当前系统时间,该时间需要传递给某些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
请让我知道我需要什么纠正
答案 0 :(得分:3)
您使用的是toEpochSecond()
而不是toEpochMilli()
您的Timestamp
构造函数的Javadoc
Timestamp(长时间)使用毫秒时间值构造一个Timestamp对象。
因此您可以使用Instant.now().toEpochMilli()
,因为Instant.now()
将以UTC返回您Instant
(当然,如果可能,请避免使用旧的日期API,请使用JDK8中的新的日期API)
答案 1 :(得分:3)
改用现代的 java.time 类。
Instant
.now()
.toString()
2019-01-23T01:23:45.123456789Z
您使用的是可怕的旧日期时间类,而这些类早已完全被 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驱动程序的详细信息和查询的要求,使用Timestamp
,Instant
(UTC偏移量为零)或OffsetDateTime
。
LocalDateTime
和Date
类存在设计问题,并且已经过时了。 Timestamp
类可能非常令人困惑,对于将其解释为时间戳(如名称所示)还是一天中的日期和时间似乎并没有达成共识。幸运的是,从JDBC 4.2开始,您不再需要Timestamp
。
例如:
Timestamp
答案 3 :(得分:1)
为什么不能使用DateTimeFormatter
sqlTimestamp.toInstant().atOffset(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS"))