我从[{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
,而不是dateB
和a
。
我尝试了各种方法,例如将b
转换为LocalDateTime
并查找其长度。为此,我使用了两种方法。
String
但第一种方法为date.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).length();
date.toString().length();
和dateA
提供了长度19,而第二种方法为dateB
和dateA
提供了长度16。
我无法找到区分dateB
和dateA
的方法。
答案 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中 日期可以用以下方式表示:
如您所见,无法区分年 - 月 - 日 - 小时 - 分 - 秒和年 - 月 - 日 - 小时 - 分钟。因此,在完成从String
到LocalDateTime
的转换后,您无法区分它。唯一的方法是使用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
}