首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得当前本地时间的UTC转换的Java时间戳?

如何获得当前本地时间的UTC转换的Java时间戳?
EN

Stack Overflow用户
提问于 2020-02-20 08:11:07
回答 3查看 1.6K关注 0票数 1

有人能帮忙获取当前本地时间的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转换的时间戳?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-20 08:33:41

你可以这样做:

代码语言:javascript
复制
LocalDateTime localDateTime = Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    System.out.println(localDateTime.format(formatter));
票数 3
EN

Stack Overflow用户

发布于 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)。例如:

代码语言:javascript
复制
    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传递给它。

代码语言:javascript
复制
    LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);

剩下的和以前一样。示例输出:

2020年-02-22T13:05:08.776

如果你真的需要一个老式的java.sql.Timestamp

你在世界协调时要求要一个TimestampTimestamp总是在UTC。更准确地说,它是一个独立于时区的时间点,因此将它转换成一个不同的时区是没有意义的。在内部,它被实现为自那个时代以来的毫秒和纳秒计数。这个时代被定义为世界协调时1970年的第一个时刻。

不过,Timestamp类是一个令人困惑的类。有一件事可能会让您感到困惑,那就是当您打印它,从而隐式调用它的toString方法时。toString方法使用JVM的默认时区来呈现字符串,因此打印本地时区中的时间。令人困惑。如果您在SQL中的数据类型是没有时区的timestamp,则您的JDBC驱动程序很可能会解释时区中的Timestamp,以便将其转换为SQL timestamp。这在您的情况下是不正确的,因为您的数据库使用UTC (推荐的做法)。我可以想到三种可能的解决方案:

  1. 某些数据库引擎允许您在会话上设置时区。我本人对它没有任何经验,这是我读过的东西;但它可能会强制执行从Timestamp到UTC中的SQL timestamp的正确转换。
  2. 您可以在Java中进行不正确的转换,以弥补Java和SQL之间正在执行的相反的不正确转换。这是一个黑客,不是我想要在我的代码中。我把它作为最后的手段。 LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);时间戳ts = Timestamp.valueOf(now);System.out.println(ts); 2020年-02-22 13:05:08.776

您注意到,它似乎只与上面的UTC时间一致。这是从Vipin Sharma的答案中得到的同样的结果,除了(1)我的代码更简单,(2)你得到了更高的精度,还包括了秒的分数。

  1. 让数据库在UTC中生成当前时间戳,而不是在Java中生成时间戳。

链接

票数 3
EN

Stack Overflow用户

发布于 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中存储正确的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60315418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档