java 如何将DateTime-Pattern中的前导零设置为可选

lb3vh1jj  于 2023-01-16  发布在  Java
关注(0)|答案(3)|浏览(109)

我有一个用户输入字段,并希望解析他的日期,无论他在。
用户可能提供带有前导零或不带前导零的日期,因此我希望能够解析这样的输入

02.05.2019

还有这个

2.5.2019

但据我所知,没有办法使前导零可选,要么总是有2个数字,如01,03,12等,或只有必要的数字,如1,3,12。
显然,我必须决定是否允许前导零,但真的没有办法使前导零可选吗?
我测试了一个包含前导零dd.MM.uuuu的模式,我测试了一个不包含前导零d.M.uuuu的模式,当我解析错误的输入和错误的模式时,抛出了异常。
因此,我的问题是,是否有一种方法,使前导零可选。

qqrboqgw

qqrboqgw1#

如果你知道的话,这是微不足道的,一个模式字母,例如dM,可以接受一个或两个数字(或者年份最多9个数字)。

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("d.M.u");
    System.out.println(LocalDate.parse("02.05.2019", dateFormatter));
    System.out.println(LocalDate.parse("3.5.2019", dateFormatter));
    System.out.println(LocalDate.parse("4.05.2019", dateFormatter));
    System.out.println(LocalDate.parse("06.5.2019", dateFormatter));
    System.out.println(LocalDate.parse("15.12.2019", dateFormatter));

输出:

2019-05-02
2019-05-03
2019-05-04
2019-05-06
2019-12-15

我在文档中搜索了这些信息,但没有找到。我认为这没有得到很好的记录。

vwhgwdsa

vwhgwdsa2#

您可以使用如下所示的自定义格式创建DateTimeFormatter

DateTimeFormatter.ofPattern("d.M.yyyy")

然后,如果日期提供1或2位数的日和月,您就可以解析日期。

String input = "02.5.2019";
LocalDate date = LocalDate.parse(input, DateTimeFormatter.ofPattern("d.M.yyyy"));

我在这里使用了新的java.time包中的LocalDate,所以我假设您的java版本是最新的。

yacmzcpb

yacmzcpb3#

您建议的日期格式应该可以使用-就像下面的测试一样:

@Test
public void test() throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("d.M.yyyy");
    f.parse("7.8.2019");
    f.parse("07.08.2019");
    f.parse("007.008.002019");
}

DateTimeFormatter在比较中不接受年的前导零,但日和月的前导零不是问题:

@Test
public void test2() throws ParseException {
    DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
    DateTimeFormatter f = builder.appendPattern("d.M.yyyy").toFormatter();
    f.parse("7.8.2019");
    f.parse("07.08.2019");
    f.parse("007.008.2019");
}

相关问题