我正在尝试按以下格式将当前日期时间输出为 UTC: 2016-01-11T14:08:42+00:00
final SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
final String dateString = formatter.format(new Date());
“dateString”现在应包含“2016-01-11T14:08:42+00:00”,但它包含“2016-01-11T14:08:42Z”。
如果没有“UTC”时区设置,我会得到正确的格式,但是 - 当然 - 在我的特定时区......
有什么想法吗?
请参阅 SimpleDateFormat 的文档:
对于格式化[使用 ISO 8601 时区],如果距 GMT 的偏移值为 0,则会生成“Z”。
因此,这种行为是预期的。
您可以:
ZZZ
;然而,这会产生“+0000”Z
:str.replaceAll("Z$", "+00:00")
2016-01-11T14:08:42+00:00
与 2016-01-11T14:08:42Z
相同。
它们只是表示同一事物的不同方式。 ISO 8601 标准指定
Z
表示 +00:00
的时区偏移(或与 UTC 的零偏移)。
java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的旧版java.util
日期时间 API。任何新代码都应使用 java.time
API。
java.time
API 的类型使用 ISO 8601 标准格式。由于您的日期时间字符串采用 ISO 8601 标准格式,因此您可以使用 OffsetDateTime#parse
而无需显式指定 DateTimeFormatter
。
DateTimeFormatter
文档提到
区域偏移“Z”为零
因此,据我所知,没有办法使用
+00:00
来代替 Z
来获得 DateTimeFormatter
。正如 Andy Turner 提到的,您可以使用 String
操作将 Z
替换为 +00:00
。
演示:
import java.time.OffsetDateTime;
class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.parse("2016-01-11T14:08:42+00:00");
System.out.println(odt);
// String manipulation to replace Z with +00:00
String formatted = odt.toString().replace("Z", "+00:00");
System.out.println(formatted);
}
}
在设置了 UTC 时区的 JVM 上执行时的输出:
2016-01-11T14:08:42Z
2016-01-11T14:08:42+00:00
从 Trail:日期时间了解有关现代日期时间 API 的更多信息。