0

我正在尝试使用 DateTimeFormatter 解析日期字符串。我收到以下异常:

错误的日期格式 10.10.2020 12:00:00 java.time.format.DateTimeParseException:无法在索引 2 处解析文本“10.10.2020 12:00:00”

 String date="10.10.2020 12:00:00";
  
 String dateTimeFormat = "MM/dd/yyyy HH:mm:ss a";
 String exportTimeZone = "UTC";

 DateTimeFormatter format = DateTimeFormatter.ofPattern(dateTimeFormat);

 LocalDateTime impDateTime = LocalDateTime.parse(StringUtils.trim(date), format);
 ZonedDateTime dateInUtc = ZonedDateTime.ofInstant(impDateTime.atZone(ZoneId.of(exportTimeZone)).toInstant(), ZoneId.systemDefault());
 return format.format(dateInUtc);
              

任何帮助,将不胜感激?

4

2 回答 2

2

您已经使用/而不是.格式。此外,当您使用 时HH,这意味着它是 24 小时格式,而不是am/pm,因此您不应该在格式中使用awith HH。此外,您的日期时间字符串中没有am/pm,因此a在格式中使用无论如何都会导致错误。

演示:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTime = "10.10.2020 12:00:00";

        // Define the format
        DateTimeFormatter format = DateTimeFormatter.ofPattern("MM.dd.yyyy HH:mm:ss");

        // Parse date-time as using the defined format
        LocalDateTime impDateTime = LocalDateTime.parse(dateTime, format);

        // Get date-time at UTC
        ZonedDateTime dateTimeInUtc = impDateTime.atZone(ZoneId.of("Etc/UTC"));

        // Display
        System.out.println(dateTimeInUtc);
    }
}

输出:

2020-10-10T12:00Z[Etc/UTC]
于 2020-07-24T09:56:44.427 回答
1

让我们阅读消息:

java.time.format.DateTimeParseException:无法在索引 2 处解析文本“10.10.2020 12:00:00”

索引是从 0 开始的,因此索引 2 in10.10.2020 12:00:00是第一个点(句点,点)所在的位置。所以Java无法解析那个点。要找出原因,我们看一下格式模式字符串中的对应位置

String dateTimeFormat = "MM/dd/yyyy HH:mm:ss a";

因此,月份 10 已成功解析,接下来是格式化程序所期望的 - 一个斜线。斜线和点之间的差异解释了异常。

进一步提示:当获取正确解析的格式模式字符串变得非常重要时,请先尝试格式化已知日期:

    System.out.println("To be parsed: " + date);
    LocalDateTime knownDateTime = LocalDateTime.of(2020, Month.OCTOBER, 10, 12, 0);
    System.out.println("Formatted:    " + knownDateTime.format(format));

在这种情况下输出:

To be parsed: 10.10.2020 12:00:00
Formatted:    10/10/2020 12:00:00 PM

这种打印方式可以更轻松地发现我们所拥有的内容与格式化程序期望解析的内容之间的差异。

于 2020-07-24T11:27:14.040 回答