此日期是否为 Java 中的有效日期?

Is this Date a valid one in Java?

这个 00/00/00 是 Java 中 MM/dd/yy 格式的有效日期吗?

我已经尝试了下面的示例代码来查看 00/00/00 是否是 Java 中的有效代码。但是,被解析的日期是 SUN Nov 30 00:00:00 IST 2.

public static void main(String[] args) {

System.out.println(new SimpleDateFormat("MM/dd/yy").parse("00/00/00"));

}

如果不是,我如何在 Java 中解析 MM/dd/yy 格式的日期字符串 "00/00/00"

问题是我需要读取字符串 00/00/00,它是在文本文件中获得的。在此过程中,当我使用 SimpleDateFormatparse() 方法解析该字符串时,我得到 SUN Nov 30 00:00:00 IST 2 作为输出。但是,我期待第 0 年、第 0 天、第 0 个月作为输出。你认为这可能吗?

感谢您的宝贵时间。

雨果已经说过了:

The best you can do is check if the String is 00/00/00 and handle it separately - or try to parse with the setLenient(false) option and catch the exception.

我想在这里做的是向您展示如何跳过过时的(通常很麻烦)SimpleDateFormat class 并按照建议使用现代 Java 日期和时间 API.

我的首选解决方案是明确检查日期字符串:

    if (dateFromFile.equals("00/00/00")) {
        System.out.println("0000-00-00");
    } else {
        System.out.println(LocalDate.parse(dateFromFile, 
                                           DateTimeFormatter.ofPattern("MM/dd/yy")));
    }

我假设您的字符串在 String dateFromFile.

另一种选择是尝试解析字符串并捕获异常(现代 DateTimeFormatter 默认情况下并不宽松):

    try {
        System.out.println(LocalDate.parse(dateFromFile, 
                   DateTimeFormatter.ofPattern("MM/dd/yy")));
    } catch (DateTimeParseException dtpe) {
        System.out.println("0000-00-00");
    }

一个潜在的优势是它还会捕获字符串包含未知字段零但字面上不等于 00/00/00 的情况——例如 07/00/170/0/0

第三个也是最差的选项,宽松地解析并与 00/00/00:

的日期进行比较
    DateTimeFormatter parseFormatter = DateTimeFormatter.ofPattern("MM/dd/yy")
            .withResolverStyle(ResolverStyle.LENIENT);
    LocalDate unknownDateParsed = LocalDate.of(1999, Month.NOVEMBER, 30);
    LocalDate date = LocalDate.parse(dateFromFile, parseFormatter);
    if (date.equals(unknownDateParsed)) {
        System.out.println("0000-00-00");
    } else {
        System.out.println(date);
    }

DateTimeFormatter 假设 2000–2099 给它一个两位数的年份,所以 00/00/00 变成 1999 年 11 月 30 日,因为它是 2000 年 1 月 1 日之前的 1 个月 1 天。

最后一种方法的一个问题是验证较差:它会让其他不正确的日期(例如 05/35/1713/32/45 在没有通知的情况下通过。

将此类输入视为错误

正如其他人所说,现代西方年表中没有零月,也没有零日。

因此,我会将此类输入视为错误条件,并拒绝输入。

DateTimeFormatter f = DateTimeFormatter. ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.US ) ;
…

if( input.equals( "00/00/00" ) ) { 
    … // handle error 
} else {
    LocalDate ld = LocalDate.parse( input , f ) ; 
}

这是错误还是特殊值,您应该询问数据来源。也许它是一个“空”类型值的替代品,一个未知的日期。如果是这样,我会建议一个替代方案。例如,“未知”一词或指定的日期值。假设您的已知值更新,一个可能的此类值可能是 1970-01-01 的 common epoch reference date。对于日期时间,使用常量 Instant.EPOCH 值,1970-01-01T00:00:00Z.