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'.
- 但是当我使用具有上述格式的 DateTimeFormatter 时,我看到了不同的输出。
- 为 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.time
、modern 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.
就是这样。该格式默认输出必要的纳米。
从 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'.
- 但是当我使用具有上述格式的 DateTimeFormatter 时,我看到了不同的输出。
- 为 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.time
、modern 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.
就是这样。该格式默认输出必要的纳米。