4

我得到LocalDateTime了从创建的对象String。我想检查该原始字符串是否具有“秒”参数。我的两个输入是:

String a = "2016-06-22T10:01"; //not given
String b = "2016-06-22T10:01:00"; //not given

LocalDateTime dateA = LocalDateTime.parse(a, DateTimeFormatter.ISO_DATE_TIME);
LocalDateTime dateB = LocalDateTime.parse(b, DateTimeFormatter.ISO_DATE_TIME);

问题是我得到dateAand dateB,而不是aand b

我尝试了各种方法,例如转换LocalDateTimeString找到它的长度。为此,我使用了两种方法。

date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).length();
date.toString().length();

但是第一种方法为两者都给出了长度 19 ,而 第二种方法为两者和 给出了长度dateA16 。dateBdateAdateB

我找不到任何方法来区分dateAdateB

4

3 回答 3

3

正如其他人已经说过的,LocalDateTime-object 总是有第二部分。另一个问题是原始输入是否有第二部分。仅使用 Java-8-means 就可以找到答案(但它很丑,因为它基于异常控制流):

String a = "2016-06-22T10:01"; // not given
String b = "2016-06-22T10:01:00"; // given

boolean hasSecondPart;
try {
    TemporalAccessor tacc =
        DateTimeFormatter.ISO_DATE_TIME.parseUnresolved(a, new ParsePosition(0));
    tacc.get(ChronoField.SECOND_OF_MINUTE);
    hasSecondPart = true;
} catch (UnsupportedTemporalTypeException ex) {
    hasSecondPart = false;
}
System.out.println(hasSecondPart); // true for input b, false for input a

边注:

使用我的库Time4J可以使用以下代码对字符串输入是否有第二部分进行无异常检查:

boolean hasSecondPart =
    Iso8601Format.EXTENDED_DATE_TIME.parseRaw(a).contains(PlainTime.SECOND_OF_MINUTE);
于 2017-06-23T11:35:22.607 回答
1

在 Java 8 DateTime API 中,日期可以用以下方式表示:

如您所见,没有办法区分年-月-日-时-分-秒和年-月-日-时-分。因此,在完成从Stringto的转换之后LocalDateTime- 你无法区分它。这样做的唯一方法是使用String(通过长度或正则表达式),而不是使用LocalDateTime对象。

于 2017-06-23T10:25:15.633 回答
1

ISO_DATE_TIME, seconds是可选的(如果不存在则设置为零),这就是它解析两个输入的原因。只有当它不为零时LocalDateTime.toString()方法才会打印秒数

因此,一旦LocalDateTime创建了对象,您就无法知道原始对象是否String具有seconds字段。


要验证输入中是否存在seconds字段String,您必须创建自己的模式并检查它是否在解析时抛出异常:

// formatter with required seconds
DateTimeFormatter withSecs = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");

LocalDateTime.parse(b, withSecs); // OK
LocalDateTime.parse(a, withSecs); // DateTimeParseException

如果您只想检查该字段是否存在,但不想构建LocalDateTime对象,您也可以使用parseUnresolved不会引发异常的方法:

ParsePosition position = new ParsePosition(0);
withSecs.parseUnresolved(a, position);
if(position.getErrorIndex() == -1) {
    System.out.println("No error (it contains seconds)"); // b gets here
} else {
    System.out.println("Error (it does not contain seconds)"); // a gets here
}
于 2017-06-23T10:27:07.957 回答