ZonedDateTime为SS部分忽略00(ZonedDateTime ignores 00 fo

2019-10-29 07:09发布

我想字符串值“2018-10-11T12:00:00Z”转换; 到ZonedDateTime。 如果使用默认ZonedDateTime.parse(zonedDateTime)然后即00 SS部分被去除和我得到“2018-10-11T12:00Z”作为输出。

你能帮帮如何留住00作为SS一部分。

String zonedDateTime = "2018-10-11T12:00:00Z";

ZonedDateTime z =  ZonedDateTime.parse(zonedDateTime);
System.out.println(z);  // return 2018-10-11T12:00Z

ZonedDateTime z1 =  ZonedDateTime.parse (zonedDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ") );

System.out.println(z1);  // Exception : Text '2018-10-11T12:00:00Z' could not be parsed at index 19

Answer 1:

打印秒

当你只是打印ZonedDateTime使用System.out.println ,你是隐式调用它toString方法。 当秒和第二的分数是0, toString离开他们。 如果一定要打印出来,用格式化格式化 (而不是使用一个解析):

    DateTimeFormatter formatterWithSeconds = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX");
    System.out.println("z with seconds: " + z.format(formatterWithSeconds));

输出是:

Z,使用秒:2018-10-11T12:00:00Z

这里最重要的区别在于之间ZonedDateTime对象及其字符串表示。 所述ZonedDateTime对象总是包含秒和纳秒,同样当它们是0。串表示可以或可以不包括它们。 一ARG ZonedDateTime.parse已经解析了00秒钟。 顺便说一句,它接受既没有秒的字符串。

使用即时或OffsetDateTime

顺便说一句,因为你的字符串包含一个偏移量( Z ),并没有时区(如非洲/内罗毕),一个OffsetDateTime更精确匹配为代表。 该代码将正常工作,如果你只是查找/替换ZonedDateTimeOffsetDateTime整个以来,API是相似的。

如果偏移总是Z (为“祖鲁时区”,或从UTC偏移0),使用Instant

    String instantString = "2018-10-11T12:00:00Z";
    Instant i = Instant.parse(instantString);
    System.out.println("As Instant: " + i);

我已经给你的String变量名称是更适合这个片段; 它仍然是相同的字符串。 输出:

即时:2018-10-11T12:00:00Z

奇怪的是Instant.toString确实连打印秒的时候,他们是0。

请阅读更多关于正确类型由@Basil布尔克答案使用。

出了什么错在你的代码? 解析Z形状信

// Exception : Text '2018-10-11T12:00:00Z' could not be parsed at index 19 

这里的问题是不是与秒,也不与ss 。 指数19就是其中Z是在你的字符串。 两ARG ZonedDateTime.parse对象,因为模式字母Z不匹配Z的时间串。 如果您还需要提供格式模式字符串解析Z ,使用大写X (其中一个或多个的取决于非零如何偏移的表情)。 从模式字母的文件:

  Symbol  Meaning                     Presentation      Examples
  ------  -------                     ------------      -------
   X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15
   Z       zone-offset                 offset-Z          +0000; -0800; -08:00

链接

  • DateTimeFormatter文档
  • 相关问题: 解析日期字符串在Java中


Answer 2:

在由OLE VV答案是正确的,应该被接受。 我将添加一个思想,一个方便的参考表。

Instant

我想强调的是对方的回答提出的观点,即ZonedDateTime技术上的工作,但不是最合适的类来分析一个字符串,如2018-10-11T12:00:00Z 。 这种格式的定义ISO 8601标准。 也就是说Z上结束时,发音为“祖鲁”是指UTC(零小时-分钟-秒的偏移量)。

在ISO 8601标准格式的java.time类默认情况下使用。 无需指定的格式设置模式。

Instant是合适的类来表示UTC片刻。

Instant instant = Instant.parse( "2018-10-11T12:00:00Z" ) ;

产生在同一个String ISO 8601标准格式。

String output = instant.toString() ;

所述OffsetDateTime类表示UTC或与其它偏移从-UTC值的时刻,任何数目的小时-分钟-秒。 这个类也更加灵活,例如在通过产生具有各种格式的字符串DateTimeFormatter类。 并且要求这个类来通过JDBC 4.2和更高版本的驱动程序支持,而InstantZonedDateTime支持是JDBC可选。

上偏移量和时区之间的区别清楚。

  • 偏移从-UTC
    简单地数个小时 - 分钟 - 秒。 积极为暂时领先于UTC的(向东)和阴性暂时落后UTC(向西)。
  • 时区
    时区是更多 。 时区是在过去,现在的历史,并以抵消使用由特定地区的人民未来的变化。

在Java中的日期时间类型

下面是在Java中的基本日期时间数据类型,既​​现代又传统的参照表。 避免遗留类型:他们是可怕的,人谁不明白的复杂性和日期时间处理细微之处的设计。



文章来源: ZonedDateTime ignores 00 for ss part