更改LocalDateTimeFormat使其包含秒和毫秒

时间:2019-05-13 19:45:09

标签: java java.time

按照要求,我的代码应该将ZonedDateTime参数中的日期和OffSetTime参数中的Time附加为以下格式:“ yyyy-MM-dd HH:mm:ss.SSSz”。但是,我无法实现

我已经尝试过多种方法,包括以下使用DateTimeFormatter的方法。

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2019-05-23T09:00:00-05:00");
OffsetTime offsetTime = OffsetTime.parse("08:59:00-05:00");
LocalDateTime localDateTime = LocalDateTime.of(zonedDateTime.toLocalDate(), offsetTime.toLocalTime());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSz");
String finalDate = localDateTime.format(formatter);

我注意到: -代码在localDateTime.format(formatter)处抛出“ java.time.DateTimeException:无法提取值:类java.time.LocalDateTime”

期望是像这样获得String中的DateTime-“ 2019-05-23T08:59:00.000Z”

任何帮助表示感谢,谢谢您的宝贵时间。

1 个答案:

答案 0 :(得分:1)

四个问题:

  • LocalDateTime没有任何时区信息,所以请不要使用它。

  • 即使这样做,您的输入也只有一个时区 offset ,而不是一个完整的时区,因此格式化字符串不能使用z,因为这需要一定的时间区域名称。请改用XXX

  • 由于输入偏移-05:00,因此不应期望使用Z(Zulu)输出,因为这意味着+00:00,除非您还希望调整时间5小时之内。

  • 年份的格式模式应使用uuuu,而不是yyyy。参见uuuu versus yyyy in DateTimeFormatter formatting pattern codes in Java?

假设您要保留时区,请将代码更改为:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2019-05-23T09:00:00-05:00");
OffsetTime offsetTime = OffsetTime.parse("08:59:00-05:00");
OffsetDateTime offsetDateTime = zonedDateTime.toLocalDate().atTime(offsetTime);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSXXX");
System.out.println(offsetDateTime.format(formatter));
2019-05-23 08:59:00.000-05:00

如果您想调整Zulu时间(即UTC),请添加行以进行调整:

OffsetDateTime offsetDateTime = zonedDateTime.toLocalDate().atTime(offsetTime)
                                .withOffsetSameInstant(ZoneOffset.UTC);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSXXX");
System.out.println(offsetDateTime.format(formatter));
2019-05-23 13:59:00.000Z