【问题标题】:Unable to parse string into Java 8 LocalDateTime [duplicate]无法将字符串解析为 Java 8 LocalDateTime [重复]
【发布时间】:2020-07-11 22:35:24
【问题描述】:

运行它会给我以下错误,我错过了什么?

public static void main(String[] args) {

    DateTimeFormatter _timestampFomatGMT = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    LocalDateTime localDateTime = LocalDateTime.parse("20200331094118137",_timestampFomatGMT);
    System.out.println(localDateTime);     
}

给我以下异常。我错过了什么?

Exception in thread "main" java.time.format.DateTimeParseException: Text '20200331094118137' could not be parsed at index 0
        at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
        at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
        at java.time.LocalDateTime.parse(LocalDateTime.java:492)
        at cotown.lib.common.util.JavaTimeUtil.main(JavaTimeUtil.java:90)

【问题讨论】:

  • 你没有给它"20200331"这个字符串吗?你给它"20200331094118137",格式错误。
  • 另外,你的格式yyyyMMdd代表LocalDate,所以如果你想要一个LocalDateTime(在一天的开始?),你应该先把它解析成LocalDate,然后再转换到LocalDateTime
  • 您还想解析没有时间部分的 LocalDate。我建议使用LocalDate.parse("....", formatter).atStartOfDay()
  • 道歉编辑了代码
  • 编辑后,问题似乎与this 重复。你能确认一下吗?

标签: java datetime java-8


【解决方案1】:

如果不另外传递时间值,您无法将仅日期的 String 解析为 LocalDateTime

您可以做的是使用类似于您的代码的LocalDate 之类的仅限日期的类:

public static void main(String[] args) {
    DateTimeFormatter _timestampFomatGMT = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate localDate = LocalDate.parse("20200331",_timestampFomatGMT);
    System.out.println(localDate);
}

这只会输出

2020-03-31

如果您确实需要 LocalDateTime 并且无法将要解析的 String 调整为包含时间,则通过这样的中间操作传递 0 小时和分钟的额外时间(但请记住输出也将包括时间信息):

public static void main(String[] args) {
    DateTimeFormatter _timestampFomatGMT = DateTimeFormatter.ofPattern("yyyyMMdd");
    LocalDate localDate = LocalDate.parse("20200331",_timestampFomatGMT);
    LocalDateTime localDateTime = LocalDateTime.of(localDate, LocalTime.of(0, 0));
    System.out.println(localDateTime);
}

或者按照@Shubham 的建议使用LocalDateTime time = LocalDate.parse("20200331", _timestampFomatGMT).atStartOfDay();

输出将是:

2020-03-31T00:00

仅输出日期,将最后一个示例的最后一行更改为

System.out.println(localDateTime.format(DateTimeFormatter.ISO_DATE));

它只会以 ISO 表示形式输出 LocalDateTime 的日期部分:

2020-03-31

编辑

针对您的最新问题更新,这可能会有所帮助:

public static void main(String[] args) {
    DateTimeFormatter timestampFomatGMT = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
    LocalDateTime localDateTime = LocalDateTime.parse("20200331094118137", timestampFomatGMT);
    System.out.println(localDateTime);
}

输出:

2020-03-31T09:41:18.137

【讨论】:

  • 我正在做你在编辑中所做的同样的事情
  • @AbhishekSingh 我复制并粘贴了您对该问题的初稿的代码......这就是为什么我首先写了不太相关的东西。我有大约 40 分钟前的代码。 Exception 是在您执行更新后的代码时发生的吗?如果没有,请将新的错误消息添加到您的问题中。
  • @AbhishekSingh 您的代码实际上正在运行......到底是什么问题?
  • 它对我不起作用。我得到以下异常。
  • @AbhishekSingh 我可以确认您/我的代码可以在 Java 10 上编译和执行,但在使用 Java 8 时不行。这是由于 Shubham 的答案中提到的错误,如果您必须使用 Java 8,可能会出现问题。
【解决方案2】:

Java 不接受纯日期值作为 DateTime。

尝试使用 LocalDate,

public static void main(String[] args) {
DateTimeFormatter _timestampFomatGMT = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate localDateTime = LocalDate.parse("20200331",_timestampFomatGMT);
System.out.println(localDateTime);
}

或者如果你真的必须使用 LocalDateTime,那么试试

LocalDateTime time = LocalDate.parse("20200331", _timestampFomatGMT).atStartOfDay();

编辑

已经提出了https://bugs.openjdk.java.net/browse/JDK-8031085 的错误。 它已在 JDK 9 中修复。

【讨论】:

  • 提个醒.atStartOfDay()
  • 我现在编辑了代码。
猜你喜欢
  • 2020-02-27
  • 2015-10-14
  • 2017-01-30
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多