我试图告诉Gson如何解析LocalDateTime和LocalDate,但我遇到了这个错误,在我看来它应该与格式匹配。我在想,要么我对解析日期有些不了解,要么我对Gson有些不了解。
java.time.format.DateTimeParseException:无法在索引0解析文本2017101800000700
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, new JsonDeserializer<LocalDateTime>() {
@Override
public LocalDateTime deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
return LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
}
}).registerTypeAdapter(LocalDate.class, new JsonDeserializer<LocalDate>() {
@Override
public LocalDate deserialize(JsonElement json, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException {
return LocalDate.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyyMMdd"));
}
}).create();
正如@Jon Skeet在评论中所说,与输入字符串相比,您的模式有1个额外的数字,因此YYMMDDHHMMSSSS无法工作:输入有16个数字,而模式YYMMDDHHMMSSSS需要17个数字。
虽然最后一部分(0700)看起来像UTC偏移量,但它缺少一个符号(因此应该是0700或0700)。偏移量表示与UTC的差异,如果没有符号,它是不明确的:你不能说它是在UTC之前还是之后。
即使它真的是一个偏移量,我也找不到没有符号的解析方法:我尝试了所有可用的选项,但都不起作用。总是需要一个符号,所以将其解析为偏移量是不可能的,除非您做出任意假设(例如“它是正的”)并手动更改输入,如下所示:
// assuming the offset "0700" is positive (7 hours ahead UTC)
String dateStr = "2017101800000700";
// insert the "+" manually, so input becomes 201710180000+0700
dateStr = dateStr.substring(0, 12) + "+" + dateStr.substring(12, 16);
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyyMMddHHmmXX");
System.out.println(LocalDateTime.parse(dateStr, fmt)); // 2017-10-18T00:00
这将导致LocalDateTime等于:
2017-10-18T00:00
另一种选择是将
07
视为秒,将最后2个零视为秒的分数。
在这种情况下,由于Java 8 API中的错误,诸如YYYYMMDDHHMMSSS之类的模式将无法工作。
上面的相同链接还提供了解决方法:使用java。时间总体安排带有java的DateTimeFormatterBuilder。时间世俗的计时字段(以秒为单位)。
String dateStr = "2017101800000700";
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// date/time
.appendPattern("yyyyMMddHHmmss")
// milliseconds (with 2 digits)
.appendValue(ChronoField.MILLI_OF_SECOND, 2)
// create formatter
.toFormatter();
System.out.println(LocalDateTime.parse(dateStr, fmt)); // 2017-10-18T00:00:07
这将解析以下
LocalDateTime
:
2017-10-18T00:00:07
请注意,它与前一个不同,因为现在我们考虑的是秒。
这看起来是一件很简单的事情,但我没有做到。 我有一个字符串模式,它是yyyyMMddHH,我试图将其解析为LocalDateTime的一个实例 代码如下: 它引发以下异常: 无法从输入中解析HH字段 我在这里查看了javadoc,但这没有帮助。 为什么我会有这个例外?如何解决这个问题? 编辑: 我无法删除 以下是限制条件: 用户将给出和(可能是和) 模式必须始终有日期(年月日) 中的时间是可选的,
我正在开发新闻应用程序,我已经将从现在到那个日期的运行时间进行了转换,但当我运行代码时,我的适配器类中出现了以下异常 JAVA时间总体安排DateTimeParseException:无法在索引0处分析文本“09/10/2019”,无法在索引19处找到未分析的文本 低于我的适配器类 以下是JSON响应:
我正在尝试解析dd-MMM-yyyy格式的日期。 它抛出以下异常 它可以很好地解析dd-MM-yyyy格式,但无法解析dd-MM-yyyy格式。我厌倦了设置语言环境。美国也是,但在这种情况下也失败了。
dateTimeParseException:无法在索引0处分析文本“Tue Dec 30 14:28:38 CET 2014” 这是如何造成的,我该如何解决?
我对Java Spring的ExceptionHandler有一个问题。我有一个名为EntityNotFoundException的异常,我希望在引发异常时从REST控制器调用ExceptionHandler方法。 这是我的REST控制器方法代码: 这是我的异常处理程序代码: } 我不知道为什么,当我获得DataIntegrityViolationException时,会调用ExceptionHa