如何区分LocalDateTime

时间:2017-06-23 08:02:29

标签: time java-8 localtime date-parsing localdate

我从[{1}}创建了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); dateA,而不是dateBa

我尝试了各种方法,例如将b转换为LocalDateTime并查找其长度。为此,我使用了两种方法。

String

但第一种方法为date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).length(); date.toString().length(); dateA提供了长度19,而第二种方法为dateBdateA提供了长度16。

我无法找到区分dateBdateA的方法。

3 个答案:

答案 0 :(得分:3)

正如其他人已经说过的那样,LocalDateTime - 对象总是第二部分。另一个问题是如果原始输入有第二部分。只用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);

答案 1 :(得分:1)

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

如您所见,无法区分年 - 月 - 日 - 小时 - 分 - 秒和年 - 月 - 日 - 小时 - 分钟。因此,在完成从StringLocalDateTime的转换后,您无法区分它。唯一的方法是使用String(按长度或正则表达式),而不是使用LocalDateTime对象。

答案 2 :(得分:1)

ISO_DATE_TIME中,是可选的(如果不存在则设置为零),这就是它解析两个输入的原因。并LocalDateTime.toString() method will print the seconds only if it's not zero

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

要验证输入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
}