【问题标题】:JAVA convert local time (GMT+8) to UTC timeJAVA 将本地时间 (GMT+8) 转换为 UTC 时间
【发布时间】:2023-03-26 14:13:01
【问题描述】:

我想将本地日期时间从 html 转换为 UTC 时间:

html:

<label>Start Time:</label><input type="datetime-local" name="start_time" />

java:

request.getParameter("start_time") // print out ex:2021-01-07T10:42

这是当地时间(GMT+8),我想将其转换为UTC字符串时间

例如:转换为 -> 2021-01-07T02:42

我搜索了很多资源,但仍然不知道该怎么做。

【问题讨论】:

标签: java html date utc localdatetime


【解决方案1】:

在 ISO-8601 格式中,您只需将时区偏移量附加到字符串中,java.time.Instant 就知道如何处理它:

Instant result = Instant.parse("2021-01-08T09:36:29+08:00");
System.out.println(result);

打印出来: 2021-01-08T01:36:29Z

【讨论】:

  • 您使用的是哪个 Java 版本?在我的 Java 11 上,我得到 java.time.format.DateTimeParseException: Text '2021-01-08T09:36:29+08:00' could not be parsed at index 19
  • 我在 Java 14 上运行了这个,但是 AFAIK 这应该不会对 java.time.Instant 类产生任何影响。
  • 它是 JDK 的一部分。从 Java 1.8 开始。
  • 对于 Java 1.7 使用 ThreeTen Backport。相同的代码,只移植到 Java 1.6 和 1.7。
  • 我也出现这个问题:java.time.format.DateTimeParseException: Text '2021-01-08T09:36:29+08:00' could not be parsed at index 19
【解决方案2】:

java.time 通过 ThreeTen Backport

java.time 是现代 Java 日期和时间 API。我建议我们将它用于我们的日期和时间工作。它是 Joda-Time 的继任者,并于 2014 年推出 Java 1.8。它还在 ThreeTen Backport 中向后移植到 Java 1.6 和 1.7。使用 ThreTen Backport 我们可以这样做:

    String startTime = "2021-01-07T10:42";
    OffsetDateTime utcTime = LocalDateTime.parse(startTime)
            .atZone(ZoneId.systemDefault())
            .toOffsetDateTime()
            .withOffsetSameInstant(ZoneOffset.UTC);
    System.out.println(utcTime);

我在亚洲/上海时区的 Java 1.7 上运行此代码(偏移量 +08:00)。那么输出是:

2021-01-07T02:42Z

时间与您想要的一致。它采用 UTC,由结尾的 Z 表示。

如果您想明确从哪个时区转换,请使用 ZoneId.of("Asia/Hong_Kong") 之类的东西,而不是 ZoneId.systemDefault()。最好以 region/city 格式提供相关的时区 ID,而不是仅仅提供 GMT 偏移量。

为什么要使用外部库进行转换? java.time 是面向未来的日期和时间库。一旦您继续使用 Java 8、9、10、11、12、13、14、15、16 或更高版本,更改您的导入以使用内置的 java.time,再次测试,您的代码是最现代的。注意代码是如何明确转换为 UTC 的,这并不奇怪。 java.time 非常好用。

链接

【讨论】:

    猜你喜欢
    • 2010-09-15
    • 2018-09-17
    • 2015-11-09
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多