【问题标题】:Joda-Time create LocalDate from String with PatternJoda-Time 从带有模式的字符串创建 LocalDate
【发布时间】:2015-12-18 05:05:53
【问题描述】:

我正在尝试使用 JodaTime 库从输入字符串创建一个 LocalDate 对象。该字符串来自我无法控制的数据库。输入的出生日期完全正确如下所示:

1963-07-19T00:00:00.000+0000

我只想要1963-07-19 部分,我不想要时间部分。所以我尝试实现这样的格式化程序:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");

然后像这样创建 LocalDate 对象:

LocalDate dob = formatter.parseLocalDate(dateOfBirth);

但我得到了错误:

Invalid format: "1963-07-19T00:00:00.000+0000" is malformed at "T00:00:00.000+0000"

我也试过这样的格式化程序:

DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZ");

然后我得到错误:

Cannot parse "1963-07-19T00:00:00.000+0000": Value 0 for clockhourOfHalfday must be in the range [1,12]

知道如何完成我想要的吗?

【问题讨论】:

    标签: java parsing jodatime formatter


    【解决方案1】:

    您的第一个示例不起作用,因为 parseLocalDate 必须将整个输入字符串与您的模式匹配。

    对于您的第二个示例,根据javadoc of DateTimeFormat,模式字母h 定义

    h       clockhour of halfday (1~12)  number        12
    

    看起来像你想要的

    H       hour of day (0~23)           number        0
    

    【讨论】:

    • 完美,这行得通。我只是担心数据库会在以后吐出一些更奇怪的东西并使程序崩溃。手指交叉。
    • @richard 如果需要,jodatime 允许您定义多个解析器。见here
    【解决方案2】:

    您显示的日期采用标准格式 - ISO8601 标准。

    Joda-Time 有一个特殊的类,用于为这个特定标准创建 DateTimeFormatter 对象 - ISODateTimeFormat 类。

    所以你可以这样做:

    DateTimeFormatter formatter = ISODateTimeFormat.dateTime();
    LocalDate dob = formatter.parseLocalDate(theDate);
    

    有关处理 ISO-8601 日期格式不同变体的其他方法,请参阅documentation。对于您显示的特定字符串,dateTime() 方法应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2023-04-09
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多