Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取当前本地时间的UTC转换Java时间戳?_Java_Jdbc_Datetime Format - Fatal编程技术网

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

如何获取当前本地时间的UTC转换Java时间戳?,java,jdbc,datetime-format,Java,Jdbc,Datetime Format,有人能帮忙获取当前本地时间的UTC转换Java时间戳吗? 主要目标是获取当前日期和时间,转换为UTC时间戳,然后作为时间戳yyyy-MM-dd hh:MM:ss[.nnnnnnn]存储在Ignite缓存中 我的尝试是Timestamp.fromInstant.now。但是,它仍然考虑我的本地时区+03:00。我得到的结果是“2020-02-20 10:57:56”,而不是理想的“2020-02-20 07:57:56” 如何获取UTC转换的时间戳?您可以这样做: LocalDateTime lo

有人能帮忙获取当前本地时间的UTC转换Java时间戳吗? 主要目标是获取当前日期和时间,转换为UTC时间戳,然后作为时间戳yyyy-MM-dd hh:MM:ss[.nnnnnnn]存储在Ignite缓存中

我的尝试是Timestamp.fromInstant.now。但是,它仍然考虑我的本地时区+03:00。我得到的结果是“2020-02-20 10:57:56”,而不是理想的“2020-02-20 07:57:56”


如何获取UTC转换的时间戳?

您可以这样做:

LocalDateTime localDateTime = Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    System.out.println(localDateTime.format(formatter));

您可以这样做:

LocalDateTime localDateTime = Instant.now().atOffset(ZoneOffset.UTC).toLocalDateTime();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
    System.out.println(localDateTime.format(formatter));
不要使用时间戳 你很可能不需要时间戳。这很好,因为Timestamp类设计得很糟糕,实际上是对已经设计得很糟糕的Date类的真正攻击。这两类课程也早已过时。相反,近6年前我们得到了java.time,这是一种现代的java日期和时间API。由于JDBC4.2也适用于JDBC驱动程序,也适用于现代JPA实现

使用OffsetDateTime 对于时间戳,数据库中建议的数据类型是带时区的时间戳。在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 从您的问题中,我得到的印象是数据库中的数据类型是没有时区的时间戳。这只是第二个最好的选择,但是您可以向它传递LocalDateTime

其余的和以前一样。示例输出:

2020-02-22T13:05:08.776

如果您确实需要老式的java.sql.Timestamp 您要求使用UTC的时间戳。时间戳始终以UTC为单位。更准确地说,它是一个独立于时区的时间点,因此将其转换为不同的时区是没有意义的。在内部,它是以自纪元以来的毫秒和纳秒为单位实现的。纪元定义为UTC 1970年的第一个时刻

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

某些数据库引擎允许您在会话上设置时区。我自己对它没有任何经验,这是我读过的东西;但它可能会强制执行从Java时间戳到UTC中SQL时间戳的正确转换。 您可能会在Java中进行不正确的转换,以补偿在Java和SQL之间执行的相反的不正确转换。这是一个黑客,不是我想在我的代码中包含的东西。我把它作为最后的手段

    LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);
    Timestamp ts = Timestamp.valueOf(now);
    System.out.println(ts);
2020-02-22 13:05:08.776

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

您是否让数据库以UTC而不是Java生成当前时间戳。 链接 解释如何使用java.time。 相关问题: 不要使用时间戳 你很可能不需要时间戳。这很好,因为Timestamp类设计得很糟糕,实际上是对已经设计得很糟糕的Date类的真正攻击。这两类课程也早已过时。相反,近6年前我们得到了java.time,这是一种现代的java日期和时间API。由于JDBC4.2也适用于JDBC驱动程序,也适用于现代JPA实现

使用OffsetDateTime 对于时间戳,数据库中建议的数据类型是带时区的时间戳。在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 从您的问题中,我得到的印象是数据库中的数据类型是没有时区的时间戳。这只是第二个最好的选择,但是您可以向它传递LocalDateTime

其余的和以前一样。示例输出:

2020-02-22T13:05:08.776

如果您确实需要老式的java.sql.Timestamp 您要求使用UTC的时间戳。时间戳始终以UTC为单位。更准确地说,它是一个独立于时区的时间点,因此将其转换为不同的时区是没有意义的。在内部,它是以毫秒和纳秒为单位实现的 从古至今。纪元定义为UTC 1970年的第一个时刻

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

某些数据库引擎允许您在会话上设置时区。我自己对它没有任何经验,这是我读过的东西;但它可能会强制执行从Java时间戳到UTC中SQL时间戳的正确转换。 您可能会在Java中进行不正确的转换,以补偿在Java和SQL之间执行的相反的不正确转换。这是一个黑客,不是我想在我的代码中包含的东西。我把它作为最后的手段

    LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);
    Timestamp ts = Timestamp.valueOf(now);
    System.out.println(ts);
2020-02-22 13:05:08.776

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

您是否让数据库以UTC而不是Java生成当前时间戳。 链接 解释如何使用java.time。 相关问题: 不管你能在24小时内通过什么。 文档上写着yyyy-MM-dd hh:MM:ss[.nnnnnnnnn],因此您可能会在代码中尝试使用它来格式化日期,但这将导致中午后的时间出错。相反,请使用yyyy-MM-dd HH:MM:ss[.nnnnnnn]格式设置日期

注意大写的HH。如果您现在使用UTC nowUTC和TOSTRINGYYY MM dd HH:MM:ss调用时使用的是ZonedDateTime或Joda的DateTime,则无论您在24小时内可以通过什么方式调用,ss都将以UTC存储正确的时间。

。 文档上写着yyyy-MM-dd hh:MM:ss[.nnnnnnnnn],因此您可能会在代码中尝试使用它来格式化日期,但这将导致中午后的时间出错。相反,请使用yyyy-MM-dd HH:MM:ss[.nnnnnnn]格式设置日期


注意大写的HH。如果您现在使用UTC nowUTC和TOSTRINGYYY MM dd HH:MM:ss调用时使用的是ZonedDateTime或Joda的DateTime,则会将正确的时间存储在UTC中。

查看此链接以获取有关UTC时间戳的信息。我建议您不要使用时间戳。那门课设计得很糟糕,而且早已过时。相反,您的现代数据库驱动程序或JPA实现应该能够接受UTC格式的OffsetDateTime,或者如果需要的话,可以接受LocalDateTime,这两种格式都来自。有关UTC时间戳的信息,请查看此链接。我建议您不要使用时间戳。那门课设计得很糟糕,而且早已过时。相反,您的现代数据库驱动程序或JPA实现应该能够接受UTC格式的OffsetDateTime,或者如果需要,可以接受LocalDateTime,两者都是从.HH 24小时i.o.HH 12小时开始的,但都可以。几乎是一个T而不是空格的toString。完全同意,只是将其格式化为问题中预期的格式。非常感谢您的建议!但是,它返回一个字符串类型的值,而时间戳是在Apache Ignite cache中将其存储为日期和时间所必需的。Timestamp.valueOflocalDateTime.Formatter将在您的情况下工作。谢谢。即使没有.formatter,上面的一个也可以工作。Just Timestamp.valueOfInstant.now.atOffsetZoneOffset.UTC.toLocalDateTime返回UTC格式的“2020-02-20 10:24:28”。再次感谢!小时24小时i.o.小时12小时但很好。几乎是一个T而不是空格的toString。完全同意,只是将其格式化为问题中预期的格式。非常感谢您的建议!但是,它返回一个字符串类型的值,而时间戳是在Apache Ignite cache中将其存储为日期和时间所必需的。Timestamp.valueOflocalDateTime.Formatter将在您的情况下工作。谢谢。即使没有.formatter,上面的一个也可以工作。Just Timestamp.valueOfInstant.now.atOffsetZoneOffset.UTC.toLocalDateTime返回UTC格式的“2020-02-20 10:24:28”。再次感谢!非常感谢非常详细的回答!这对我来说绝对有意义。然而,这与我的需要有点矛盾。实际上,我使用的是ApacheIgnite数据持久化机制,而不是SQL本身。另外,系统的逻辑是“database worker”类的setter获取LocalDateTime。现在,不同的时区用户都是期望值,需要将其作为时间戳存储在Ignite的缓存中。我会考虑你的建议,并尝试将其融入我的工作中。谢谢谢谢你的回复。对不起,我不知道。听起来你给自己带来了一个有趣的挑战。非常感谢你提供了非常详细的答案!这对我来说绝对有意义。然而,这与我的观点有点矛盾
需要。实际上,我使用的是ApacheIgnite数据持久化机制,而不是SQL本身。另外,系统的逻辑是“database worker”类的setter获取LocalDateTime。现在,不同的时区用户都是期望值,需要将其作为时间戳存储在Ignite的缓存中。我会考虑你的建议,并尝试将其融入我的工作中。谢谢谢谢你的回复。对不起,我不知道。听起来你有一个有趣的挑战。