Java 8 DateTimeFormatterBuilder appendValue zeroPadding 未按预期工作
Java 8 DateTimeFormatterBuilder appendValue zeroPadding Not working as expected
我正在尝试将毫秒格式化为 3 位数字,以便从 offsetDate 时间序列化到 ISOString
Value
Expected
Actual
2020-06-16T05:47:40.1-06:00
2020-06-16T11:47:40.001Z
2020-06-16T11:47:40.100Z
2020-06-16T05:47:40.12-06:00
020-06-16T11:47:40.012Z
020-06-16T11:47:40.120Z
我用的时候
private static final DateTimeFormatter outFormatter = new DateTimeFormatterBuilder()
.parseLenient()
.append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
.appendLiteral('.')
.appendValue(ChronoField.MILLI_OF_SECOND,3)
.appendZoneId()
.toFormatter()
.withZone(ZoneId.from(ZoneOffset.UTC));
文档说填充将在左侧。但是我得到了正确的填充。
关于如何使用日期格式化程序实现的任何建议?
2020-06-16T05:47:40.1-06:00
中的.1
代表fraction-of-second即.1
秒,因此也可以写成.100
秒。以毫秒为单位,就是.1 * 1000
= 100
毫秒。
除此之外,您还可以使用 OffsetDateTime#withOffsetSameInstant
大大简化您的代码,如下所示:
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(parseOdtStrAndConvertWithOffsetSameInstant("2020-06-16T05:47:40.1-06:00"));
System.out.println(parseOdtStrAndConvertWithOffsetSameInstant("2020-06-16T05:47:40.12-06:00"));
}
static String parseOdtStrAndConvertWithOffsetSameInstant(String text) {
OffsetDateTime odt = OffsetDateTime.parse(text).withOffsetSameInstant(ZoneOffset.UTC);
return odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX"));
}
}
输出:
2020-06-16T11:47:40.100Z
2020-06-16T11:47:40.120Z
我正在尝试将毫秒格式化为 3 位数字,以便从 offsetDate 时间序列化到 ISOString
Value | Expected | Actual |
---|---|---|
2020-06-16T05:47:40.1-06:00 | 2020-06-16T11:47:40.001Z | 2020-06-16T11:47:40.100Z |
2020-06-16T05:47:40.12-06:00 | 020-06-16T11:47:40.012Z | 020-06-16T11:47:40.120Z |
我用的时候
private static final DateTimeFormatter outFormatter = new DateTimeFormatterBuilder()
.parseLenient()
.append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
.appendLiteral('.')
.appendValue(ChronoField.MILLI_OF_SECOND,3)
.appendZoneId()
.toFormatter()
.withZone(ZoneId.from(ZoneOffset.UTC));
文档说填充将在左侧。但是我得到了正确的填充。
关于如何使用日期格式化程序实现的任何建议?
2020-06-16T05:47:40.1-06:00
中的.1
代表fraction-of-second即.1
秒,因此也可以写成.100
秒。以毫秒为单位,就是.1 * 1000
= 100
毫秒。
除此之外,您还可以使用 OffsetDateTime#withOffsetSameInstant
大大简化您的代码,如下所示:
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Test
System.out.println(parseOdtStrAndConvertWithOffsetSameInstant("2020-06-16T05:47:40.1-06:00"));
System.out.println(parseOdtStrAndConvertWithOffsetSameInstant("2020-06-16T05:47:40.12-06:00"));
}
static String parseOdtStrAndConvertWithOffsetSameInstant(String text) {
OffsetDateTime odt = OffsetDateTime.parse(text).withOffsetSameInstant(ZoneOffset.UTC);
return odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX"));
}
}
输出:
2020-06-16T11:47:40.100Z
2020-06-16T11:47:40.120Z