joda DateTimeFormatter失败,格式为0

时间:2018-05-08 16:41:04

标签: java parsing numbers jodatime literals

import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DateTest {

    public static void main(String[] args) {
        DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy0MMdd");
        System.out.println(DF_YYYY_0MM_DD.parseLocalDate("201800101"));
    }

}

期望上述内容返回2018-01-01的日期。但得到例外

    Exception in thread "main" java.lang.IllegalArgumentException: Invalid format: "201800101" is too short
    at org.joda.time.format.DateTimeFormatter.parseLocalDateTime(DateTimeFormatter.java:900)
    at org.joda.time.format.DateTimeFormatter.parseLocalDate(DateTimeFormatter.java:844)

1 个答案:

答案 0 :(得分:1)

您需要根据docs使用单引号。

declare var android :any;

虽然很奇怪,但在我的测试中它仍然不起作用,因为看起来像库中的一个错误 - joda DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy'0'MMdd");中的isNumericToken(String token)基本上没有考虑数字文字。这最终导致joda期望9年而不是4位数。

因此,作为一种解决方法,您可以这样做来构建格式化程序(而不是直接从字符串模式创建它):

DateTimeFormat

或者,在日期前加上5个零(因此那一年现在有9个数字)。

DateTimeFormatter DF_YYYY_0MM_DD = new DateTimeFormatterBuilder().appendYear(4,4).appendLiteral("0").appendMonthOfYear(2).appendDayOfMonth(2).toFormatter();

或使用分隔符。

DateTimeFormatter DF_YYYY_0MM_DD = DateTimeFormat.forPattern("yyyy'0'MMdd");
System.out.println(DF_YYYY_0MM_DD.parseLocalDate("00000201800101"));