【问题标题】:Why does an invalid date parses successfully as a real date?为什么无效日期会成功解析为真实日期?
【发布时间】:2015-08-22 22:19:45
【问题描述】:

有人可以向我解释一下如何让以下方法为显示的输入返回 false 的值吗?它正在返回 true,这是我没想到的。

isDateValid("19/06/2012 5:00, 21:00","dd/MM/yyyy HH:mm")

我认为这应该返回false,但显然Java 不这么认为。提供的实际日期字符串末尾包含这些额外字符:", 21:00"

public static boolean isDateValid(String date, String dateFormat) 
{
        try {
            DateFormat df = new SimpleDateFormat(dateFormat);
            df.setLenient(false);
            Date newDate = df.parse(date);
            System.out.println("Date value after checking for validity: " + newDate);
            return true;
        } catch (ParseException e) {
            return false;
        }
}

【问题讨论】:

    标签: java date formatting simpledateformat


    【解决方案1】:

    parse 不一定使用整个String。这在the Javadoc 中非常清楚,强调我的:

    parse

    public Date parse(String source) throws ParseException

    从给定字符串的开头解析文本以生成日期。 该方法可能不会使用给定字符串的整个文本。 有关日期解析的更多信息,请参阅parse(String, ParsePosition) 方法。


    您可以使用parse(String text, ParsePosition pos) 检测字符串末尾是否有多余的字符。如果pos 不等于字符串的末尾,那么末尾还有多余的字符。

    这是一个包含测试台的工作程序,可以按照您的预期正确检查。在这个程序中,pos.getIndex() 将是 0 如果它根本无法解析,如果末尾有多余的字符,则数字太小,如果它按您想要的方式工作,则等于

    public class DateFormatTest {
      public static void main(String[] args) {
        // should be false
        System.out.println(isDateValid("19/06/2012 5:00, 21:00", "dd/MM/yyyy HH:mm"));
        System.out.println(isDateValid("19/06/201", "dd/MM/yyyy HH:mm"));
        
        System.out.println();
        
        // should be true
        System.out.println(isDateValid("19/06/2012 5:00", "dd/MM/yyyy HH:mm"));
      }
    
      public static boolean isDateValid(String date, String dateFormat) {
        ParsePosition pos = new ParsePosition(0);
        DateFormat df = new SimpleDateFormat(dateFormat);
        df.setLenient(false);
        df.parse(date, pos);
    
        return pos.getIndex() == date.length();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2017-04-04
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      相关资源
      最近更新 更多