如何使用可选的秒参数创建DateTimeformatter

Ami*_*arg 6 java datetime-parsing java-8 java-time

我正在尝试创建一个DateTimeformatter以验证以下日期时间:

String date1 = "2017-07-06T17:25:28";
String date2 = "2017-07-06T17:25:28.1";
String date3 = "2017-07-06T17:25:28.12";
String date4 = "2017-07-06T17:25:28.123";
String date5 = "2017-07-06T17:25:28.1234";
String date6 = "2017-07-06T17:25:28.12345";
String date7 = "2017-07-06T17:25:28.123456";
String date8 = "2017-07-06T17:25:28.";
Run Code Online (Sandbox Code Playgroud)

我已尝试使用以下日期时间格式器来验证上述日期:

public static final String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
                                   .appendPattern(DATE_TIME_FORMAT_PATTERN)
                                   .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
                                   .toFormatter();
Run Code Online (Sandbox Code Playgroud)

它工作正常,所有上述日期,但根据我的要求就应该失败java.time.format.DateTimeParseExceptiondate8.

注意:我知道我可以使用以下格式化程序获得预期的结果:

DateTimeFormatter formatter2 = DateTimeFormatter
                       .ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S]");
Run Code Online (Sandbox Code Playgroud)

但我想知道我们可以通过改变来实现预期的结果formatter1吗?

要解析我使用的日期:

LocalDateTime.parse(date1, formatter1);
Run Code Online (Sandbox Code Playgroud)

小智 11

您必须创建一个包含小数点后跟1到6位数的可选部分(使用optionalStart()optionalEnd()方法):

String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
    .appendPattern(DATE_TIME_FORMAT_PATTERN)
    // optional decimal point followed by 1 to 6 digits
    .optionalStart()
    .appendPattern(".")
    .appendFraction(ChronoField.MICRO_OF_SECOND, 1, 6, false)
    .optionalEnd()
    .toFormatter();
Run Code Online (Sandbox Code Playgroud)

这解析来自date1date7并抛出一个java.time.format.DateTimeParseExceptiondate8.


这也有同样的作用:

String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
    .appendPattern(DATE_TIME_FORMAT_PATTERN)
    // optional decimal point followed by 1 to 6 digits
    .optionalStart()
    .appendFraction(ChronoField.MICRO_OF_SECOND, 1, 6, true)
    .optionalEnd()
    .toFormatter();
Run Code Online (Sandbox Code Playgroud)

  • .appendFraction(ChronoField.MICRO_OF_SECOND,0,6,true)对我一直有效。因为如果最小值是“ 0”,则基本上变为可选... (2认同)