Datetime 带时区问题的ISO日期时间

Datetime 带时区问题的ISO日期时间,datetime,java-8,Datetime,Java 8,我只是按照下面的文档打印带时区的ISO日期时间 这是我的密码 TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.nnnnnn+|-hh:mm"); df.setTimeZone(tz); dateTimeWithTimeZone = df.format(new Date()); 然而,我得

我只是按照下面的文档打印带时区的ISO日期时间

这是我的密码

TimeZone tz = TimeZone.getTimeZone("UTC");
        DateFormat df = new SimpleDateFormat("yyyy-mm-dd'T'hh:mm:ss.nnnnnn+|-hh:mm"); 
        df.setTimeZone(tz);
        dateTimeWithTimeZone = df.format(new Date());
然而,我得到了这个例外
非法模式字符“n” 我不能在Java中直接使用这种格式

java.time 刚才我运行这个代码段时,得到了以下输出:

2019-03-18T22:28:13.549319Z

您链接到的页面中不清楚,但它是UTC中的ISO 8601字符串,因此应该是您所需要的全部。我正在利用java.time类从它们的
toString
方法生成ISO8601输出这一事实。链接页面确实显示了带有连字符、
T
和冒号(
2008-09-15T15:53:00+05:00
)的格式,它显示了另一个以秒为小数(
15:53:00.322348
)的示例,以及第三个以
Z
表示UTC(
20080915T155300Z
)的示例,所以我希望这三者的结合也可以

您在问题中使用的格式似乎试图将偏移量设置为
+00:00
,而不是
Z
。如果这是一个要求,它只是稍微复杂一点。我们使用显式格式化程序来控制ISO 8601中的变化:

        DateTimeFormatter iso8601Formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx");
        dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
        System.out.println(dateTimeWithTimeZone);
2019-03-18T22:28:13.729711+00:00

你的代码出了什么问题? 您试图将源代码中的格式符号与
SimpleDataFormat
一起使用。首先,您不应该使用
SimpleDateFormat
,尤其是在Java8或更高版本中。那门课是出了名的麻烦和过时。其次,它的一些格式模式字母与源代码中的符号一致,而有些则不一致,因此不能仅使用源代码中的symvol字符串。相反,您需要阅读文档,找到用于年、月等的正确格式模式字母,并注意它们区分大小写:
MM
MM
是不同的

链接
解释如何使用java.time。

您真的需要使用这些旧API吗?使用Java8,您可以使用
System.out.println(DateTimeFormatter.ISO_INSTANT.format(INSTANT.now())System.out.println(Instant.now())作为默认格式。但是如果您坚持使用
SimpleDateFormat
,您可以使用
“yyyy-MM-dd'T'HH:MM:ssXXX”
模式字母
n
与现代java日期和时间API中的
DateTimeFormatter
一起工作纳秒。它不适用于
SimpleDataFormat
。正如@Holger所暗示的,这个类是出了名的麻烦和过时的,你不应该想使用它。此外,现代API打印ISO格式时没有任何显式的格式化程序,因此有充分的理由对其进行更改。这是有意义的。
        DateTimeFormatter iso8601Formatter
                = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSSxxx");
        dateTimeWithTimeZone = OffsetDateTime.now(ZoneOffset.UTC).format(iso8601Formatter);
        System.out.println(dateTimeWithTimeZone);