JAVA 将本地时间 (GMT+8) 转换为 UTC 时间

问题描述

我想将 datetime-local 从 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

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

解决方法

在 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.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.systemDefault() 之类的内容代替 ZoneId.of("Asia/Hong_Kong")。以 region/city 格式提供相关时区 ID 比仅仅提供 GMT 偏移更好。

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

链接

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...