gpt4 book ai didi

java - 检查日期时间字符串是否可转换为 ZonedDateTime

转载 作者:行者123 更新时间:2023-11-29 04:22:31 27 4
gpt4 key购买 nike

我想检查我的 String 是否可以转换为 ZonedDateTime

 String datetime = "2018-01-11T21:32:10.876+02:00"; // valid
String badDateTime = "blah blah"; //not valid

我考虑过用 this regex 检查一下但由于私有(private)原因,这对我来说不是相关的解决方案。

我也想过以那种方式使用try..catch

public void testing() {
String datetime = "2018-01-11T21:32:10.876+02:00";

System.out.println(isDateTime("no")); // false
System.out.println(isDateTime(datetime)); // true
}


private boolean isDateTime(String str){
boolean checkDateTimeString;

try {
ZonedDateTime.parse(str);
checkDateTimeString = true;
} catch (DateTimeParseException e){
checkDateTimeString = false;
}

return checkDateTimeString;
}

但是使用异常作为返回值是一种不好的做法,而且会消耗性能。

有没有其他简单又好的方法来做那件事?

最佳答案

如果您查看ZonedDateTime.parse 方法的实现,您会发现该方法定义如下:

public static ZonedDateTime parse(CharSequence text) {
return parse(text, DateTimeFormatter.ISO_ZONED_DATE_TIME);
}

public static ZonedDateTime parse(CharSequence text, DateTimeFormatter formatter) {
Objects.requireNonNull(formatter, "formatter");
return formatter.parse(text, ZonedDateTime::from);
}

如果您还查看了 DateTimeFormatter,您会发现一个名为 parseUnresolved 的方法。您可以按如下方式使用它:

DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(str, new ParsePosition(0));

传递的字符串将被解析但不解析。然后,您可以查看 parseResolved0 实现并在不抛出异常的情况下执行实际解析。您将不得不改用方法返回值。

您需要的方法如下所示:

public TemporalAccessor parse(final CharSequence text) {
ParsePosition pos = new ParsePosition(0);
TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(text, pos);
if (temporalAccessor == null || pos.getErrorIndex() >= 0 || pos.getIndex() < text.length()) {
return null;
}
return temporalAccessor;
}

请注意,返回的 TemporalAccessor 不会被解析。我需要更深入地查看代码才能准确找到它的含义。

最后,如果你想检查一个字符串是否可以无一异常(exception)地被解析为ZonedDateTime,你只需要检查返回值:

parse("2018-01-11T21:32:10.876+02:00"); //return ZonedDateTime instance
parse("blah blah"); //return null

编辑:

既然返回的Parsed不能用,那么写一个parse方法是“错误的”(除非TemporalAccessor暴露出来的方法对你有用)。因此,检查有效性的方法会更正确:

public boolean isParseableAsZonedDateTime(final CharSequence text) {
ParsePosition pos = new ParsePosition(0);
TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_ZONED_DATE_TIME.parseUnresolved(text, pos);
if (temporalAccessor == null || pos.getErrorIndex() >= 0 || pos.getIndex() < text.length()) {
return false;
}
return true;
}

关于java - 检查日期时间字符串是否可转换为 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48214813/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com