有人能帮忙获取当前本地时间的UTC转换的Java时间戳吗?其主要目标是获取当前日期和时间,转换为UTC时间戳,然后作为时间戳yyyy-MM-dd hh:mm:ss[.nnnnnnnnn]存储在Ignite缓存中。
我的尝试是Timestamp.from(Instant.now())。但是,它仍然考虑我的本地时区+03:00。因此,我得到的是'2020-02-20 10:57:56',而不是理想的'2020-02-20 07:57:56'。
如何获得UTC转换的时间戳?
发布于 2020-02-20 08:33:41
你可以这样做:
LocalDateTime localDateTime = Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
System.out.println(localDateTime.format(formatter));发布于 2020-02-22 13:09:15
不要使用时间戳
您很可能不需要Timestamp。这是很好的,因为Timestamp类的设计很差,实际上是对已经设计糟糕的Date类的一个真正的攻击。这两门课也早已过时。相反,在近6年前,我们得到了java.time,这是一个现代的Java和time。因为JDBC4.2也适用于您的JDBC驱动程序,也适用于您的现代JPA实现。
使用OffsetDateTime
对于时间戳,您的数据库中推荐的数据类型是timestamp with time zone。在这种情况下,在Java中使用偏移量为零的OffsetDateTime (即UTC)。例如:
OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
System.out.println(now);
PreparedStatement statement = yourDatabaseConnection
.prepareStatement("insert into your_table (tswtz) values (?);");
statement.setObject(1, now);
int rowsInserted = statement.executeUpdate();刚才来自System.out.println()的示例输出:
2020年-02-22T13:04:06.320Z
如果数据库时间戳没有时区,则使用LocalDateTime。
从您的问题中,我得到的印象是数据库中的数据类型是没有时区的timestamp。这只是第二好的选择,但是您可以将一个LocalDateTime传递给它。
LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);剩下的和以前一样。示例输出:
2020年-02-22T13:05:08.776
如果你真的需要一个老式的java.sql.Timestamp
你在世界协调时要求要一个Timestamp。Timestamp总是在UTC。更准确地说,它是一个独立于时区的时间点,因此将它转换成一个不同的时区是没有意义的。在内部,它被实现为自那个时代以来的毫秒和纳秒计数。这个时代被定义为世界协调时1970年的第一个时刻。
不过,Timestamp类是一个令人困惑的类。有一件事可能会让您感到困惑,那就是当您打印它,从而隐式调用它的toString方法时。toString方法使用JVM的默认时区来呈现字符串,因此打印本地时区中的时间。令人困惑。如果您在SQL中的数据类型是没有时区的timestamp,则您的JDBC驱动程序很可能会解释时区中的Timestamp,以便将其转换为SQL timestamp。这在您的情况下是不正确的,因为您的数据库使用UTC (推荐的做法)。我可以想到三种可能的解决方案:
Timestamp到UTC中的SQL timestamp的正确转换。您注意到,它似乎只与上面的UTC时间一致。这是从Vipin Sharma的答案中得到的同样的结果,除了(1)我的代码更简单,(2)你得到了更高的精度,还包括了秒的分数。
链接
发布于 2020-12-09 21:35:23
不管点燃医生说是什么,你可以在24小时内通过。文档中写的是yyyy-MM-dd hh:mm:ss[.nnnnnnnnn],所以您可能会在代码中诱惑使用它来格式化日期,但这会导致中午后的时间出现错误。相反,使用yyyy-MM-dd HH:mm:ss[.nnnnnnnnn]格式化您的约会。
注意大写HH。如果您现在使用ZonedDateTime或Joda的DateTime调用UTC now(UTC),那么toString("yyyy-MM-dd HH:mm:ss")将在UTC中存储正确的时间。
https://stackoverflow.com/questions/60315418
复制相似问题