Scala/Java 解析日期未知格式

Scala/Java parse date unknown format

我有以下代码:

val dateString = "12/Sep/2017:11:25:29 +0200"
println(LocalDateTime.parse(
    dateString, 
    DateTimeFormatter.ofPattern("dd/LLL/yyyy:HH:mm:ss X")
));

和以下错误:

Exception in thread "main" java.time.format.DateTimeParseException:
Text '12/Sep/2017:11:25:29 +0200' could not be parsed at index 3

我的格式有什么问题?我读了 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html 但没有找到正确的

EDIT1:“dd/MMM/yyyy:HH:mm:ss X”也不起作用

您必须使用 M 而不是 LL 用于数字格式):

"dd/MMM/yyyy:HH:mm:ss X"

您可能还必须设置 java 将用来解释月份的 Locale(可能您的语言环境不是英语)

LocalDateTime.parse("12/Sep/2017:11:25:29 +0200", DateTimeFormatter.ofPattern("dd/MMM/yyyy:HH:mm:ss X", Locale.ENGLISH));

这对我有用(声明了语言环境,可能 L 也能正常工作)

从输入字符串中删除 / 应该可以。 (没检查)

val dateString = "12 Sep 2017:11:25:29 +0200"

正确但不充分。您应该指定一个 Locale,其中 Sep 可识别为月份名称。需要英语语言环境,例如 Locale.US.

如果未指定,将自动隐式应用 JVM 当前的默认时区。 Sep 不是俄语、法语、日语等语言中的月份名称

提示:作为一般规则,请始终明确指定您想要的语言环境和时区;使用可选参数。隐式依赖 JVM 的当前默认值可能会出现问题。

    Locale locale = Locale.US ;
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MMM/yyyy:HH:mm:ss X" ).withLocale( locale ) ;
    String input = "12/Sep/2017:11:25:29 +0200" ;
    OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;

    System.out.println( odt ) ;

看到这个code run live on IdeOne.com

2017-09-12T11:25:29+02:00

至于您对 L 的使用,Javadoc 解释说 L 是“独立”月份名称。一些语言根据月份是单独使用还是组合使用来改变拼写。英语不是其中一种语言。