Java DateTimeFormatter在时区为+;0000

Java DateTimeFormatter在时区为+;0000,java,datetime,datetime-format,Java,Datetime,Datetime Format,假设我有两个约会:' 20191105235900 20190802235900 我将dateTimeFormatter与SimpleDataFormat一起使用(“yyyy-MM-dd'HH:MM:ssXXX”,Locale.getDefault()) 最后我得到了: 2019-11-05T23:59:00Z-错误,正确将是2019-11-05T23:59:00+00:00 2019-08-02T23:59:00+01:00-正确 另外,我不能仅仅用+00:00替换Z,因为这将是另一个

假设我有两个约会:'

  • 20191105235900
  • 20190802235900
我将dateTimeFormatter与SimpleDataFormat一起使用(“yyyy-MM-dd'HH:MM:ssXXX”,Locale.getDefault())

最后我得到了:

  • 2019-11-05T23:59:00Z-错误,正确将是2019-11-05T23:59:00+00:00
  • 2019-08-02T23:59:00+01:00-正确

另外,我不能仅仅用+00:00替换Z,因为这将是另一个处理步骤

完整代码:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.getDefault());
this.timestampString = sdf.format(date);    
当您查看时,您会发现这是预期的行为:

协调世界时(UTC)

如果时间以UTC为单位,则在时间后直接添加一个Z,不带空格。Z是UTC零偏移的区域标识符。因此,“09:30 UTC”表示为“09:30Z”或“0930Z”。“14:45:15 UTC”将是“14:45:15Z”或“144515Z”

ISO 8601时间表示法中的Z后缀有时被称为“祖鲁时间”,因为同一个字母用于指定祖鲁时区。然而,定义军事时区列表的ACP 121标准没有提及UTC,而是从格林威治标准时间[28]推导出“祖鲁时间”,该标准以前用作国际民用时间标准。GMT不再由科学界精确定义,可以根据上下文引用UTC或UT1。[29]


任何客户端都应该能够解析它。

当你说“错”时,它的行为与文档中描述的完全一样:“对于格式化,如果GMT的偏移量值为0,则会生成“Z”。不过,我怀疑如果你可以使用
java.time
,你可以更轻松地解决这个问题。“我也不能仅仅用+00:00替换Z,因为这将是一个额外的处理步骤。”你能解释一下为什么要添加“一个额外的处理步骤”吗“不可行吗?它产生了
2019-11-05
,您希望它是
2019-08-02
,一个完全不同的日期。这背后的原因是什么?我不明白为什么这些输入日期中的一个会产生+01:00,而另一个会产生+00:00。@Amongalen修正了,我的错。同样,我也是,但很明显,这就是它所做的。@JonSkeet这是一个涉及数十亿条条目的问题。每一步都很重要。它也是SimpleDataFormat的显式记录行为。是的,因为SimpleDataFormat将返回ISO8601格式的字符串。我希望OP能够了解为什么它基本上必须是这样,以及为什么他们可以期望符合标准的客户端毫无问题地解析它。