Datetime 带时区问题的ISO日期时间
我只是按照下面的文档打印带时区的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()); 然而,我得
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);