DateTimeFormatter在解析单位数部分时过于严格

时间:2018-05-29 08:24:13

标签: java parsing java-8 datetime-format

我的格式为MM/dd/yyyy,所以格式化的所有内容都是单位数的前导ZERO。问题是在解析时我希望能够解析"11/25/2018""5/25/2018",但格式化应始终返回前导零。

我尝试过使用不同的ResolverStyle选项而没有任何运气。

当您认为使用SimpleDateFormat开箱即用时,构建我自己的特定格式似乎是不合理的。

不胜感激任何想法,不涉及使用FormatterBuilder

从头开始制作格式化程序

4 个答案:

答案 0 :(得分:5)

您可以在Java 8时间API中使用DateTimeFormatter ALL_POSSIBLE_DATE_FORMAT = new DateTimeFormatterBuilder() .appendOptional(DateTimeFormatter.ofPattern("MM/dd/yyyy")) .appendOptional(DateTimeFormatter.ofPattern(("M/dd/yyyy"))) .toFormatter(); System.out.println(LocalDate.parse("11/25/2018", ALL_POSSIBLE_DATE_FORMAT)); System.out.println(LocalDate.parse("5/25/2018", ALL_POSSIBLE_DATE_FORMAT));

<li *ngFor = "let project of projects" class="list-group-item">{{project.name}} {{project._id}}>
<a [routerLink]="['/tasks']">View Tasks</a>
<a [routerLink]="['/newTask']" (click)="getAllTasks(project)">Create Task</a>

输出:

2018年11月25日

2018年5月25日

答案 1 :(得分:3)

使用两种不同的格式,M/d/yyyy进行解析,使用MM/dd/yyyy进行打印。前者将接受单个和两位数的月份和日期,而后者将始终打印两位数,必要时前导零。

SimpleDateFormat parseFormat = new SimpleDateFormat("M/d/yyyy");
SimpleDateFormat printFormat = new SimpleDateFormat("MM/dd/yyyy");

Date date1 = parseFormat.parse("4/5/2010");
Date date2 = parseFormat.parse("04/05/2010");
String output1 = printFormat.format(date1);
String output2 = printFormat.format(date2);
// output1 and output2 will be the same

答案 2 :(得分:2)

你需要使用M / d / yyyy。它适用于单数字和双数字。当你使用MM / dd时,你要告诉它严格使用两位数。

来自文档的内容:

  

数字:如果字母数为1,则使用输出值   最小位数且没有填充。否则,算了   数字用作输出字段的宽度,带有值   必要时填零。以下模式字母有   对字母数量的限制。只有一个字母的&#39; c&#39;和&#39; F&#39;   可以指定。最多两个字母的&#39;,&#39; H&#39;&#39; h&#39;,&#39; K&#39;,&#39; k&#39;, &#39;米&#39 ;,   并且&#39; s&#39;可以指定。最多三个字母的&#39; D&#39;可以指定。

答案 3 :(得分:2)

使用M/d/yyyy格式,因为忽略前导零。 MM/dd/yyyy表示需要正好两位数,包括可能的前导零。

    DateTimeFormatter parseformat =
            DateTimeFormatter.ofPattern("M/d/yyyy");

    DateTimeFormatter outputformat = DateTimeFormatter.ofPattern("MM/dd/yyyy");

代码段

    String d1 = "1/1/2018";
    String d2 = "02/29/2016";
    String d3 = "4/01/2018";

    LocalDate date = LocalDate.parse(d1, parseformat);
    System.out.println(date.format(outputformat));
    date = LocalDate.parse(d2, parseformat);
    System.out.println(date.format(outputformat));
    date = LocalDate.parse(d3, parseformat);
    System.out.println(date.format(outputformat));

我最终得到了

01/01/2018
02/29/2016
04/01/2018

正如所料。

有关时间模式及其解析方式,请参阅SimpleDateFormat documentation;请注意&#34;模式字母通常会重复,因为它们的数字决定了确切的演示文稿&#34;并且&#34;对于解析,忽略模式字母的数量,除非需要分隔两个相邻的字段&#34; (这里是分隔两个相邻的字段)。