无法摆脱这个错误
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);
}
}
该字符串是 ISO 8601 字符串,因此需要使用
Instant.parse(publishedAtStr)
来解析它。
LocalDateTime 可以解析 some ISO 8601 格式,但是当存在时区指示器时会失败,因此不必自己想出一个模式,只需使用 Instant
类即可。