这个Date在Java中是有效的吗?

时间:2017-07-19 14:13:34

标签: java datetime datetime-parsing

这个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格式"00/00/00"解析日期字符串MM/dd/yy

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

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

雨果已经说过了:

  

您可以做的最好的事情是检查String是否为00/00/00并处理它   单独 - 或尝试使用setLenient(false)选项进行解析   抓住例外。

我想在这里做的是向您展示如何跳过过时的(通常很麻烦的)SimpleDateFormat类,并使用现代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)在不事先通知的情况下通过。

答案 1 :(得分:1)

将此类输入视为错误

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

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

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

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

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