Java中额外数字的无法解析日期

时间:2016-09-30 10:00:04

标签: java simpledateformat

此代码有什么问题?我正在尝试解析年份和月份之间为0的日期格式。

import java.text.SimpleDateFormat;

class Main {
    public static void main(String[] args) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy'0'MMdd");
        try {
            Date date = format.parse("201600101");
            System.out.println(date);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}

输出Unparseable date:“201600101”。如果我将'0'更改为除数字之外的任何内容[例如'X'和format.parse(“2016X0101”)]这将有效。

2 个答案:

答案 0 :(得分:3)

正如Peter Lawrey所说,Java将'20160'视为一年。您可以通过将"201600101"修改为2016-00101并将格式模式重构为

来解决您的问题
SimpleDateFormat format = new SimpleDateFormat("yyyy-'0'MMdd");

这将解析你的约会。

答案 1 :(得分:1)

使用可以使用年份固定宽度为四位数的库可以解决问题。 java.time示例 - Java-8中的包:

    String input = "201600101";

    DateTimeFormatter dtf =
        new DateTimeFormatterBuilder()
            .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
            .appendLiteral('0')
            .appendPattern("MMdd")
            .toFormatter();
    LocalDate date = LocalDate.parse(input, dtf);
    System.out.println(date); // 2016-01-01

这具有不被强制改变输入的强大优势。更改格式化程序总是更好。承认,SimpleDateFormat无法实现。