问题描述
我想将 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 非常好用。
链接
- Oracle tutorial: Date Time 解释如何使用 java.time。
-
Java Specification Request (JSR) 310,其中首次描述了
java.time
。 -
ThreeTen Backport project,将
java.time
向后移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 - Java 8+ APIs available through desugaring
- ThreeTenABP,ThreeTen Backport 的 Android 版
- Question: How to use ThreeTenABP in Android Project,非常详尽的解释。
- Wikipedia article: ISO 8601