DateTimeFormatter.ISO_OFFSET_DATE_TIME 的等效格式字符串是什么?
What is the equivalent format string of DateTimeFormatter.ISO_OFFSET_DATE_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));
会输出相同的
这对我有用:
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 根据纳米值打印不同长度的秒数,而 .SSS 具有固定长度 = 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
不,这不可能
根据要求:是的,我们知道 DateTimeFormatter.ISO_OFFSET_DATE_TIME
.
没有等效的格式模式字符串
如果 DateTimeFormatter.ISO_OFFSET_DATE_TIME
为零,则省略秒 and/or 纳秒。如果纳米不为零,“将根据需要输出尽可能多的数字。”没有模式字母或模式字母组合会给您相同的行为。
在 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
和 appendFraction
方法。
顺便说一句,您不想完全复制 ISO_OFFSET_DATE_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));
会输出相同的
这对我有用:
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 根据纳米值打印不同长度的秒数,而 .SSS 具有固定长度 = 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
不,这不可能
根据要求:是的,我们知道 DateTimeFormatter.ISO_OFFSET_DATE_TIME
.
DateTimeFormatter.ISO_OFFSET_DATE_TIME
为零,则省略秒 and/or 纳秒。如果纳米不为零,“将根据需要输出尽可能多的数字。”没有模式字母或模式字母组合会给您相同的行为。
在 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
和 appendFraction
方法。
顺便说一句,您不想完全复制 ISO_OFFSET_DATE_TIME
的行为。您将需要使用内置格式化程序。