【问题标题】:Scala/Java parse date unknown formatScala/Java 解析日期未知格式
【发布时间】:2021-06-10 20:10:28
【问题描述】:

我有以下代码:

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”也不起作用

【问题讨论】:

标签: java scala date format


【解决方案1】:

Answer by Sinigaglia 正确但不充分。您应该指定一个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 是“独立”月份名称。有些语言会根据月份是单独使用还是组合使用来改变拼写。英语不是其中一种语言。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 也许是OF,但它可能会有所帮助:我使用sdfonlinetester.info 来测试日期的格式,检查它是否正确(如果网站的输出是您的输入,则正确)正在提供)
    • 文档说相反:“M/L 月份数字/文本 7;07;Jul;July;J”并使用 MMM 返回相同的错误
    • 我不确定 SimpleDateFormat 是否等同于文本月的 DateTimeFormatter
    • @Benjamin Javadoc 还解释说L 是“独立”月份名称。有些语言会根据月份是单独使用还是组合使用来改变拼写。英语不是其中一种语言。
    • @BasilBourque ho 好的,感谢您的解释。正如我所说的“dd/MMM/yyyy:HH:mm:ss X”也不起作用
    【解决方案3】:

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

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

    【讨论】:

    • 为什么我需要在解析之前清理日期?据我所知,/ 是日期格式中的一个众所周知的字符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2020-10-23
    • 2015-08-13
    • 2021-11-10
    相关资源
    最近更新 更多