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
而不是 L
(L
用于数字格式):
"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
是“独立”月份名称。一些语言根据月份是单独使用还是组合使用来改变拼写。英语不是其中一种语言。
我有以下代码:
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
而不是 L
(L
用于数字格式):
"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
是“独立”月份名称。一些语言根据月份是单独使用还是组合使用来改变拼写。英语不是其中一种语言。