DateTimeFormatter.ISO_OFFSET_DATE_TIME的等效格式字符串是什么?

时间:2018-10-03 03:39:44

标签: java java-8 java-time

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

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

将输出相同的

2 个答案:

答案 0 :(得分:3)

这对我有用:

    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

答案 1 :(得分:3)

否,这不可能

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

DateTimeFormatter.ISO_OFFSET_DATE_TIME忽略秒和/或纳秒(如果为零)。如果nanos非零,则“将输出所需的位数”。没有图案字母或图案字母的组合会给您相同的行为。

深入DateTimeFormatter内,ISO_OFFSET_DATE_TIME使用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); 的定义方式如下:

DateTimeFormatterBuilder

获得动态行为的方式是:使用optionalStart及其appendFractionISO_OFFSET_DATE_TIME方法。

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