9

我们是否知道是否存在输出相同结果的等效格式字符串DateTimeFormatter.ISO_OFFSET_DATE_TIME

IE

ZonedDateTime dateTime = ZonedDateTime.now();
System.out.println(dateTime.format(DateTimeFormatter.ofPattern(pattern)));
System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

会输出相同的

4

2 回答 2

10

这对我有用:

    ZonedDateTime dateTime = ZonedDateTime.now();
    System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
    System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));

2018-10-03T07:24:14.772+03:00 
2018-10-03T07:24:14.772+03:00

虽然它不会总是产生相同的结果,因为 ISO_OFFSET_DATE_TIME 根据 nanos 值打印具有不同长度的秒的分数,而 .SSS 具有固定的 lengh = 3

     ZonedDateTime dateTime = ZonedDateTime.of(2001, 1, 1, 0, 0, 0, 1, ZoneId.systemDefault());
     System.out.println(dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")));
     System.out.println(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));   

     2001-01-01T00:00:00.000+02:00
     2001-01-01T00:00:00.000000001+02:00
于 2018-10-03T04:26:19.960 回答
8

不,这是不可能的

根据要求:是的,我们知道没有等效的格式模式字符串DateTimeFormatter.ISO_OFFSET_DATE_TIME.

DateTimeFormatter.ISO_OFFSET_DATE_TIME如果它们为零,则省略秒和/或秒的纳秒。如果 nanos 不为零,“将根据需要输出尽可能多的数字。” 没有任何模式字母或模式字母组合会给您相同的行为。

Deep inside DateTimeFormatter,ISO_OFFSET_DATE_TIME使用 an ISO_LOCAL_TIME,它又以这种方式定义:

    ISO_LOCAL_TIME = new DateTimeFormatterBuilder()
            .appendValue(HOUR_OF_DAY, 2)
            .appendLiteral(':')
            .appendValue(MINUTE_OF_HOUR, 2)
            .optionalStart()
            .appendLiteral(':')
            .appendValue(SECOND_OF_MINUTE, 2)
            .optionalStart()
            .appendFraction(NANO_OF_SECOND, 0, 9, true)
            .toFormatter(ResolverStyle.STRICT, null);

这是获得动态行为的方法:使用 aDateTimeFormatterBuilder及其optionalStartappendFraction方法。

顺便说一句,您不想完全复制 的行为ISO_OFFSET_DATE_TIME。您将需要使用内置的格式化程序。

于 2018-10-03T10:27:01.523 回答