我想将本地日期时间从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 through ThreeTen Backport
java.time是现代java日期和时间API。我建议我们在日期和时间工作中使用它。它是Joda Time的继任者,并于2014年推出Java 1.8。它还在ThreeTen Backport中被后移植到Java 1.6和1.7。使用ThreTen背包我们可以做:
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()
。最好以地区/城市格式提供相关时区ID,而不仅仅是GMT偏移。
为什么要使用外部库进行转换?java.time是面向未来的日期和时间库。一旦您转到Java 8、9、10、11、12、13、14、15、16或更高版本,请将导入更改为使用内置的Java.time,再次测试,您的代码将是最先进的。请注意,代码是如何明确地转换为UTC的,发生的事情并不奇怪。java.time非常适合使用。
链接
- Oracle教程:日期时间,解释如何使用java.Time
- Java规范请求(JSR(310,其中首次描述了
java.time
- ThreeTen Backport项目,
java.time
到Java 6和7的Backport(JSR-310的ThreeTen( - 通过降级提供Java 8+API
- ThreeTenABP,安卓版ThreeTen背包
- 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
- 维基百科文章:ISO 8601