java.time.format.DateTimeParseException:文本'Mi Mai 09 09:17:24 2018'无法在索引0处解析

时间:2018-05-09 07:52:11

标签: java datetime-format

我正在尝试使用德语区域设置格式化日期时间对象但是我收到了错误。

String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);

错误:

java.time.format.DateTimeParseException: Text 'Mi Mai 09 09:17:24 2018' could not be parsed at index 0

2 个答案:

答案 0 :(得分:5)

此处和现在的解决方案:

System.setProperty("java.locale.providers", "COMPAT,CLDR");
String dateString = "Mi Mai 09 09:17:24 2018";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss yyyy", Locale.GERMAN);
LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
System.out.println(dateTime);

输出(在Java 9和Java 10上测试):

  

2018-05-09T09:17:24

您的代码中唯一的变化是我在程序开头插入了System.setProperty("java.locale.providers", "COMPAT,CLDR");。根据文档,这不应该真正起作用,但是当我尝试它时它确实有效。相反,正确的方法是在运行Java程序时在命令行上提供相同的系统属性。例如:

java -Djava.locale.providers=COMPAT,CLDR com.ajax.ParseTwoLetterDayOfWeekAbbreviationInGerman

感谢Joep Weijers在注释中指出必须在命令行上设置属性。有趣的是,相同的系统属性破坏了我的Java 8上的代码。

更现代的解决方案:

String dateString = "Mi. Mai 09 09:17:24 2018";

我在字符串中Mi之后需要一个点(一个句点)来表示它是一个缩写。

区域设置提供程序

要解析德语Java中的日期需要所谓的语言环境数据,包括德语和其他语言中使用的星期和数月的名称和缩写。为了混淆事物,这些数据来自多个来源。在所有Java 8,9和10中,Java包含来自至少两个源的区域设置数据,Java自己的区域设置数据和来自CLDR的标准化区域设置数据,Unicode公共区域设置数据存储库(我不知道是否还有一个或两个源) 。在Java 8中,Java自己的数据是默认数据,如果您需要这些数据,则需要指定CLDR。在Java 9及更高版本中,它是相反的方式:CLDR是默认值,但旧的Java数据可用作COMPAT。这解释了the comment by soon您的代码在Java 8上运行,但在Java 10上失败。

显然,Java语言环境数据的Mi没有点作为Mittwoch(星期三)的缩写,而CLDR的Mi.带有一个点。还有许多其他差异。

<强>链接

答案 1 :(得分:-4)

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;



/**
 *
 * @author Ali Hassan
 */
public class LeapTEST {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        String dateString = "Mi Mai 09 09:17:24 2018";
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EE MMM d HH:mm:ss yyyy", Locale.GERMAN);
    LocalDateTime dateTime = LocalDateTime.parse(dateString, dtf);
    System.out.print(dateTime);
    }

}