【问题标题】:No instant converter found for type: java.time.ZonedDateTime找不到类型的即时转换器:java.time.ZonedDateTime
【发布时间】:2020-04-13 00:37:32
【问题描述】:

我正在尝试从范围中获取下/上端点,当涉及到获取这些下/上端点时,它会引发如下异常:

java.lang.IllegalArgumentException: No instant converter found for type: java.time.ZonedDateTime

    at org.joda.time.convert.ConverterManager.getInstantConverter(ConverterManager.java:166)
    at org.joda.time.base.BaseDateTime.<init>(BaseDateTime.java:171)
    at org.joda.time.DateTime.<init>(DateTime.java:257)

代码:

@Override
    public WeatherStatus getForecastForFlightOverall(String icao, ... flight) {

       ...

        if ( flightmapIntegration.isMetIntegrationEnabled() ) {
            List<ViewFlightAirportDTO> airports = getRoutes(icao, flight);
            Range<ZonedDateTime> range = getRange(airports);

            DateTime from = range.lowerEndpoint() == null ? null : new DateTime(range.lowerEndpoint());
            ...

            try {
               ....
            }
        }

        return status != null ? status : WeatherStatus.UNKNOWN;
    }

getRange 方法:

 private Range<ZonedDateTime> getRange(List<...> ...) {

        if ( ....isEmpty() ) {
            return Range.singleton(ZonedDateTime.now());
        }

        Range<ZonedDateTime> result = validityRangeOf(....get(0));

        for (int i = 1; i < flightAirports.size(); i++) {
            result = ...
        }

        return result;
    }

validtyRangeOf 方法:

private Range<ZonedDateTime> validityRangeOf(ViewFlightAirportDTO firstAirport) {
        return Range.closed(firstAirport.getValidFrom(), firstAirport.getValidTill());
    }

编辑 我可以这样制作,但不知道如何完成。我的意思是 from/to 也可以是 ZonedDateTime 的类型,但我不知道如何使用下/上端点创建它的对象

   ZonedDateTime from = range.lowerEndpoint() == null ? null : new ZonedDateTime(...);
            ZonedDateTime to = ...

【问题讨论】:

  • 您不能将 ZonedDateTime 作为参数传递给 DateTime 构造函数。这就是这条消息的意思。
  • 范围是一个范围。为什么要从已经是 ZonedDateTime 的值创建新的 ZonedDateTime?直接使用range.lowerEndpoint()即可。
  • @JBNizet 该死的。我是瞎子。谢谢/。

标签: java date datetime jodatime zoneddatetime


【解决方案1】:

您当前正在尝试通过直接调用构造函数将ZonedDateTime 转换为DateTime

ZonedDateTime zonedDateTime = ZonedDateTime.now();
DateTime dateTime = new DateTime(zonedDateTime); // will cause IllegalArgumentException

您需要调用不同的构造函数来进行此转换:

DateTimeZone dateTimeZone = DateTimeZone.forID(zonedDateTime.getZone().getId()); // extract DateTimeZone separately
new DateTime(zonedDateTime.toInstant().toEpochMilli(), dateTimeZone); // convert using epoch milliseconds

这将允许您进行此转换。

【讨论】:

  • range.lowerEndpoint()range.upperEndpoint() 已经是 ZonedDateTime 对象。我不确定您要在编辑中实现什么目标。
猜你喜欢
  • 2019-03-24
  • 2021-11-19
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2014-09-19
相关资源
最近更新 更多