Java Json 日期解析

问题描述 投票:0回答:1

无法摆脱这个错误

 Text '2024-03-28T09:07:55.896198Z' could not be parsed, unparsed text found at index 26
    at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2055)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
    at java.base/java.time.ZonedDateTime.parse(ZonedDateTime.java:600)
    at com.example.demo.DemoApplication.main(DemoApplication.java:53)

我从 API 响应中获取其中一个字段为“published_at”:“2024-03-20T09:12:53.304420Z”,我尝试过滤响应,以便它仅提供从 2022 年 6 月 1 日到 4 月 1 日的数据2024。到目前为止,我尝试了几种解析格式,但总是出现类似的错误。

  try {
            HttpResponse<String> response = HttpClient.newHttpClient().send(request, BodyHandlers.ofString());
            String responseBody = response.body();

            ObjectMapper mapper = new ObjectMapper();
                    ArrayNode offersArray = mapper.createArrayNode();
                    JsonNode rootNode = mapper.readTree(responseBody);
            JsonNode offers = rootNode.path("offers");

                    LocalDate startDate = LocalDate.of(2022, 6, 1);
                    LocalDate endDate = LocalDate.of(2024, 4, 1);
                    DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;

            for (JsonNode offer : offers) {
                String publishedAtStr = offer.path("published_at").asText();
//                LocalDate publishedAt = LocalDate.parse(publishedAtStr, formatter);
                ZonedDateTime zonedDateTime = ZonedDateTime.parse(publishedAtStr, formatter);
                LocalDate publishedAt = zonedDateTime.toLocalDate();

                if ((publishedAt.isAfter(startDate) || publishedAt.isEqual(startDate)) &&
                        (publishedAt.isBefore(endDate) || publishedAt.isEqual(endDate))) {
                    ObjectNode offerNode = mapper.createObjectNode();
                    offerNode.put("title", offer.path("title").asText());
                    offerNode.put("description", offer.path("description").asText());
                    offerNode.put("location", offer.path("location").asText());
                    offerNode.put("requirements", offer.path("requirements").asText());
                    offerNode.put("published_at", publishedAtStr);

                    offersArray.add(offerNode);
                }
            }
java json spring api
1个回答
0
投票

该字符串是 ISO 8601 字符串,因此需要使用

Instant.parse(publishedAtStr)
来解析它。 LocalDateTime 可以解析 some ISO 8601 格式,但是当存在时区指示器时会失败,因此不必自己想出一个模式,只需使用
Instant
类即可。

© www.soinside.com 2019 - 2024. All rights reserved.