【问题标题】:Correct pattern for parsing from String to LocalDateTime format从 String 解析为 LocalDateTime 格式的正确模式
【发布时间】:2019-10-05 10:10:40
【问题描述】:

我正在尝试解析格式为“2019 年 3 月 1 日”或“2019 年 3 月 15 日”格式的日期,但我正在努力寻找正确的模式。

我已经尝试过使用模式“dd M/L yyyy”和简单的“d M/L yyyy”的示例,但似乎都不起作用。

String begda = "1 March 2019";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd M/L yyyy");
LocalDateTime ldtBeg = LocalDateTime.parse(begda, formatter);

它只会抛出一个 DateTimeParseException 说明它无法被解析。

【问题讨论】:

  • 一个问题 - 你需要使用 LocalDate 而不是 LocalDateTime 因为你没有时间组件。
  • 请注意,“dd”的意思是“一个月中的零填充日”,这看起来不像您在“2019 年 3 月 1 日”中看到的那样。
  • 感谢您的 cmets。我切换到对我有用的 LocalDate 和模式“d MMMM yyyy”。需要注意的一件重要事情,这导致了我的其他问题:“March”的解析还取决于语言环境,并且我的测试数据和计算机上的语言环境不匹配。
  • 当文档说M/L month-of-year 时,您误会了。这意味着M L。您需要结合以下内容阅读它:“模式字母'L'、'c'和'q'指定文本样式的独立形式。”一些语言环境具有单独的独立形式的月份名称。既然你有一个完整的日期,你不应该在这里使用它,即你不应该使用L,即你应该使用M

标签: java datetime


【解决方案1】:

使用MMMM 表示整个月份,例如March。并使用d 表示1 之类的日子。

应该是d MMMM yyyy

并指定Locale 用于人类语言读取月份名称。

LocalDate.parse( 
    "1 March 2019" , 
    DateTimeFormatter.ofPattern( 
        "d MMMM yyyy",
        Locale.UK
    )
)

【讨论】:

    【解决方案2】:

    那是因为你做错了

    java 的正确日期格式是("dd MMMM yyyy")

    如需更多信息,请访问this 网站

    【讨论】:

    • 您可以使用任意数量的日期格式,Java 为解析它们提供了很大的灵活性。没有“Java 的正确日期格式”之类的东西。
    • (声称使用完整的月份名称而不是用零填充的月份编号是“正确的日期格式”是不正确的。)
    【解决方案3】:

    您正在寻找转换字符串月份MARCH。因此,在解析时,您需要提及它是哪个 Locale。

    在使用此语言环境进行格式化时,将返回相应的月份。

    如果您熟悉日历,那么您也可以使用它。 我想这个链接可以给你一些提示

    Convert Month String to Integer in Java

    【讨论】:

    • Calender 类设计不佳且过时,也无助于提问者的问题。在这里提到它当然没有帮助。提及语言环境确实有帮助的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多