Java 是否有一个好的*严格*日期解析器?

发布于 2024-07-12 11:54:11 字数 312 浏览 4 评论 0原文

Java 是否有一个好的、严格 日期解析器? 我可以访问 Joda-Time,但我还没有看到这个选项。 我发现了“Java 是否有一个好的日期解析器”问题,虽然这是相关的,但它有点相反。 虽然这个问题要求一个宽松的、更模糊逻辑的、容易出现人为错误的解析器,但我想要一个严格的解析器。 例如,对于 JodaTime (据我所知)和 simpleDateFormat,如果您有格式“MM/dd/yyyy”:

解析此:40/40/4353

这将成为有效日期。 我想要一个解析器知道 40 是无效的月份和日期。 Java 中肯定存在这种实现吗?

Is there a good, strict date parser for Java? I have access to Joda-Time but I have yet to see this option. I found the "Is there a good date parser for Java" question, and while this is related it is sort of the opposite. Whereas that question was asking for a lenient, more fuzzy-logic and prone to human error parser, I would like a strict parser. For example, with both JodaTime (as far as I can tell) and simpleDateFormat, if you have a format "MM/dd/yyyy":

parse this: 40/40/4353

This becomes a valid date. I want a parser that knows that 40 is an invalid month and date. Surely some implementation of this exists in Java?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

挖鼻大婶 2024-07-19 11:54:11

我没有看到 Joda 将其识别为有效日期。 示例:

strict = org.joda.time.format.DateTimeFormat.forPattern("MM/dd/yyyy")
try {
    strict.parseDateTime('40/40/4353')
    assert false
} catch (org.joda.time.IllegalFieldValueException e) {
    assert 'Cannot parse "40/40/4353": Value 40 for monthOfYear must be in the range [1,12]' == e.message
}

据我所知, DateFormatsetLenient(false)。 示例:

try {
    df = new java.text.SimpleDateFormat('MM/dd/yyyy')
    df.setLenient(false)
    df.parse('40/40/4353')
    assert false
} catch (java.text.ParseException e) {
    assert e.message =~ 'Unparseable'
}

希望这有帮助!

I don't see that Joda recognizes that as a valid date. Example:

strict = org.joda.time.format.DateTimeFormat.forPattern("MM/dd/yyyy")
try {
    strict.parseDateTime('40/40/4353')
    assert false
} catch (org.joda.time.IllegalFieldValueException e) {
    assert 'Cannot parse "40/40/4353": Value 40 for monthOfYear must be in the range [1,12]' == e.message
}

As best as I can tell, neither does DateFormat with setLenient(false). Example:

try {
    df = new java.text.SimpleDateFormat('MM/dd/yyyy')
    df.setLenient(false)
    df.parse('40/40/4353')
    assert false
} catch (java.text.ParseException e) {
    assert e.message =~ 'Unparseable'
}

Hope this helps!

二智少女 2024-07-19 11:54:11

使用 DateFormat 进行严格验证的一个好方法是重新格式化已解析的日期并检查与原始字符串的相等性:

String myDateString = "87/88/9999";
Date myDate = dateFormat.parse(myDateString);
if (!myDateString.equals(df.format(myDate))){
  throw new ParseException();
}

就像一个魅力一样。

A good way to do strict validation with DateFormat is re-formatting the parsed date and checking equality to the original string:

String myDateString = "87/88/9999";
Date myDate = dateFormat.parse(myDateString);
if (!myDateString.equals(df.format(myDate))){
  throw new ParseException();
}

Works like a charm.

说不完的你爱 2024-07-19 11:54:11

如果您不想使用 SimpleDateFormat,您可以使用 apache.commons.validator.routines.DateValidator 来验证日期。

示例:

 public static Date validateDate(String value, String pattern) {
       DateValidator validator = new DateValidator();
       Date date = null;
           if (pattern!=null) {    //Pattern is passed
               date = validator.validate(value, pattern);
           } else {
               date = validator.validate(value);
           }
       return date;
    }

因此,如果返回 null,则表示日期无效,否则它是有效日期。此方法是使用 SimpleDateFormat 的替代方法,因为您不需要必须依靠抛出的异常来确定它是否是有效的日期。

You can use the apache.commons.validator.routines.DateValidator to validate the date,if you do not want to use SimpleDateFormat.

Example :

 public static Date validateDate(String value, String pattern) {
       DateValidator validator = new DateValidator();
       Date date = null;
           if (pattern!=null) {    //Pattern is passed
               date = validator.validate(value, pattern);
           } else {
               date = validator.validate(value);
           }
       return date;
    }

So if a null is returned it means that the date is not valid otherwise it's a valid date.This method is an alternative to using the SimpleDateFormat as you don't have to rely on exception being thrown to identify if it's a valid date or not.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文