- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这段代码生成时间戳,然后进行解析。
DateTimeFormatter formatter =
DateTimeFormatter
.ofPattern("yyyyMMdd kk:HH:ss.SSSZ")
.withLocale(Locale.getDefault())
.withZone(ZoneId.systemDefault());
Instant now = Instant.now();
String formatted = formatter.format(now);
Instant parsed = formatter.parse(formatted, Instant::from);
运行时,最后一行产生异常:
java.time.format.DateTimeParseException: Text '20180123 12:12:45.648-0500' could not be parsed: Unable to obtain Instant from TemporalAccessor: {SecondOfMinute=45, NanoOfSecond=648000000, OffsetSeconds=-18000, MilliOfSecond=648, MicroOfSecond=648000, HourOfDay=12},ISO,America/New_York resolved to 2018-01-23 of type java.time.format.Parsed
Caused by: java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {SecondOfMinute=45, NanoOfSecond=648000000, OffsetSeconds=-18000, MilliOfSecond=648, MicroOfSecond=648000, HourOfDay=12},ISO,America/New_York resolved to 2018-01-23 of type java.time.format.Parsed
Caused by: java.time.temporal.UnsupportedTemporalTypeException: **Unsupported field: InstantSeconds**
我用 DateTimeFormatter.ISO_INSTANT 替换了格式化程序,它工作正常。产生的实际数据几乎相同。什么是脱节?
ISO_INSTANT: 2018-01-23T16:51:25.516Z
My Format: 20180119 23:59:59.999-0800
我需要使用我的格式。这里有什么问题?
最佳答案
问题是您的格式并不完全代表 Instant,因为您的格式根本没有代表分钟。格式化程序可以正确地从 Instant 开始并以您的格式输出结果,因为 Instant 具有您的格式所需的所有数据,但您的格式不具有 Instant 所需的所有数据。
尝试将您的模式更改为 yyyyMMdd kk:HH:mm:ss.SSS
,您会发现您的代码现在可以正常工作了。请注意添加了 mm
。
如果你绝对需要一个无分钟的模式,你应该制作你自己的 TemporalQuery 来从 TemporalAccessor 中提取你需要的信息在这种情况下,我只是将分钟设置为 0
:
public class MyQuery implements TemporalQuery<Instant> {
@Override
public Instant queryFrom(TemporalAccessor temporal) {
LocalDate ld = LocalDate.from(temporal);
LocalTime lt = LocalTime.of(temporal.get(ChronoField.HOUR_OF_DAY), 0, temporal.get(ChronoField.SECOND_OF_MINUTE), temporal.get(ChronoField.NANO_OF_SECOND));
return ZonedDateTime.of(ld, lt, ZoneId.systemDefault()).toInstant();
}
}
然后我们可以像这样使用这个 TemporalQuery:
public class Test {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyyMMdd kk:HH:mm:ss.SSS")
.withLocale(Locale.getDefault())
.withZone(ZoneId.systemDefault());
Instant now = Instant.now();
String formatted = formatter.format(now);
System.out.println(formatted);
Instant ld = formatter.parse(formatted, new MyQuery());
}
}
关于java - 不支持的时间类型异常 : Unsupported field: InstantSeconds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48408688/
我正在尝试将字符串转换为 Instant。你能帮帮我吗? 我得到以下异常: Caused by: java.time.temporal.UnsupportedTemporalTypeException
我有这段代码生成时间戳,然后进行解析。 DateTimeFormatter formatter = DateTimeFormatter .ofPattern("yyyyMMdd
我是一名优秀的程序员,十分优秀!