Java DateTimeFormatter.ISO_OFFSET_DATE_TIME 输出不同于 Java Doc

Java DateTimeFormatter.ISO_OFFSET_DATE_TIME output differs from Java Doc

java 11 doc 到 ISO_OFFSET_DATE_TIME

The ISO date-time formatter that formats or parses a date-time with an offset, such as '2011-12-03T10:15:30+01:00'.

  1. 但是当我使用具有上述格式的 DateTimeFormatter 时,我看到了不同的输出。
  2. 为 DateTimeFormatter 设置时区似乎没有效果。

下面的代码应该澄清它 -

public void j8DateTimeWithFormatter() {
        DateTimeFormatter odtf = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
        String zdt = ZonedDateTime.now().format(odtf);       
        System.out.println(zdt);  // Output 2021-06-06T22:44:28.4410102+05:30 //what is this 4410102, is it nano seconds or some thing else. How to not see this. 
       
        //further
        odtf.withZone(ZoneId.of("US/Eastern")); 
        zdt = ZonedDateTime.now().format(odtf); 
        //after setting the zoneid to EST why am i still seeing time in IST
        System.out.println(zdt);  // Output 2021-06-06T22:44:28.4430055+05:30
    }

如何解决这些问题?请指教。我仍想使用 ISO_OFFSET_DATE_TIME 并查看文档中的输出 - 2021-06-06T22:44:28-04:00

what is this 4410102, is it nano seconds or some thing else. How to not see this.

这是秒的分数。如果您不想看到它,请将该值截断为秒。

System.out.println(ZonedDateTime.now().truncatedTo(ChronoUnit.SECONDS).format(odtf));

after setting the zoneid to EST why am i still seeing time in IST

因为DateTimeFormatter是不可变的,你需要按如下方式分配新值:

odtf = odtf.withZone(ZoneId.of("US/Eastern"));

演示:

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
        ZonedDateTime zdt = ZonedDateTime.now();
        System.out.println(zdt.format(dtf));

        // If you do not want nano seconds
        zdt = zdt.truncatedTo(ChronoUnit.SECONDS);
        System.out.println(zdt.format(dtf));

        // Formatting to a different timezone
        dtf = dtf.withZone(ZoneId.of("US/Eastern"));
        System.out.println(ZonedDateTime.now().format(dtf));

        // However, I recommend
        ZonedDateTime zdtNewYork = zdt.withZoneSameInstant(ZoneId.of("America/New_York"));
        System.out.println(zdtNewYork);
    }
}

输出:

2021-06-06T18:45:06.604419+01:00
2021-06-06T18:45:06+01:00
2021-06-06T13:45:06.607643-04:00
2021-06-06T13:45:06-04:00[America/New_York]

详细了解 java.timemodern Date-Time API* from Trail: Date Time


* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and

好吧,这是有意为之的行为。

文档使用了“例如”这个词,这意味着这个例子就是一个例子,因此输出可能会有所不同。

文档提到格式由 ISO_LOCAL_DATE_TIME 和偏移量组成。 ISO_LOCAL_DATE_TIME 依次由 ISO_LOCAL_DATE、字母 'T' 和 ISO_LOCAL_TIME.

组成

然后如果我们查看 ISO_LOCAL_TIME 的文档:

One to nine digits for the nano-of-second. As many digits will be output as required.

就是这样。该格式默认输出必要的纳米。