【问题标题】:Java 8 Convert given time and time zone to UTC timeJava 8 将给定时间和时区转换为 UTC 时间
【发布时间】:2023-04-04 03:20:01
【问题描述】:

我有一段时间使用字符串类型,例如:"2015-01-05 17:00"ZoneId"Australia/Sydney"

如何使用 Java 8 日期时间 API 将此时间信息转换为与 UTC 时间对应的时间?

还需要考虑夏令时。

【问题讨论】:

  • “UTC 时间”是什么意思?你想要即时吗?还是 java.sql.Date?还是自纪元以来的毫秒数?

标签: java java-8 utc java-time


【解决方案1】:

您正在寻找 Java8 中的 ZonedDateTime 类 - 具有时区的完整日期时间,并已解决与 UTC/格林威治的偏移量。在设计方面,这个类应该主要被视为LocalDateTimeZoneId 的组合。 ZoneOffset 是一条重要但次要的信息,用于确保该类代表一个瞬间,尤其是在夏令时重叠期间。

例如:

ZoneId australia = ZoneId.of("Australia/Sydney");
String str = "2015-01-05 17:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime localtDateAndTime = LocalDateTime.parse(str, formatter);
ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localtDateAndTime, australia );

System.out.println("Current date and time in a particular timezone : " + dateAndTimeInSydney);

ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC);

System.out.println("Current date and time in UTC : " + utcDate);

【讨论】:

  • 看来这个结果不是我想要的。我想转换为 UTC 时间并将 UTC 时间存储在我的数据库中。 ZonedDateTime 不是我想要的,不能映射到 DB 列类型。
  • 对不起,我在示例中添加了到 UTC 的转换。
  • 酷,看来我们必须将 LocalDateTime 转换为 ZonedDateTime,然后我们才能在不同时区之间进行转换。谢谢。
  • @MateuszSroka - 我的时间戳为零毫秒'2021-04-11 10:25:33.000'。此代码截断零。如何也显示零?我在这里发布了一个相关问题stackoverflow.com/questions/67102239/…
【解决方案2】:

现有答案的替代方法是使用适当的时区设置格式化程序:

String input = "2015-01-05 17:00";
ZoneId zone = ZoneId.of("Australia/Sydney");

DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(zone);
ZonedDateTime utc = ZonedDateTime.parse(input, fmt).withZoneSameInstant(UTC);

由于您想与数据库交互,您可能需要java.sql.Timestamp,在这种情况下您无需显式转换为 UTC 时间,而是可以使用 Instant:

ZonedDateTime zdt = ZonedDateTime.parse(input, fmt);
Timestamp sqlTs = Timestamp.from(zdt.toInstant());

【讨论】:

  • 在这种情况下什么是 UTC 变量?
  • 这是一个日期/时间,采用 UTC 时区,与悉尼的“输入”对应的时刻相同。所以在这种情况下,这将是同一天,但在早上 6 点。
【解决方案3】:
   **// Refactored Logic**     

        ZoneId australia = ZoneId.of("Australia/Sydney");
        ZoneId utcZoneID= ZoneId.of("Etc/UTC");
        String ausTime = "2015-01-05 17:00";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

        //converting in datetime of java8
        LocalDateTime ausDateAndTime = LocalDateTime.parse(ausTime, formatter);

        // DateTime With Zone
        ZonedDateTime utcDateAndTime = ausDateAndTime.atZone(utcZoneID);
        // output - 2015-01-05T17:00Z[Etc/UTC]

        // With Formating DateTime
        String utcDateTime = utcDateAndTime.format(formatter);
        // output - 2015-01-05 17:00

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2016-07-06
    • 2023-03-26
    • 2023-03-23
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多