【问题标题】:Need help with validating a date在验证日期方面需要帮助
【发布时间】:2011-06-01 20:32:08
【问题描述】:

我有下面的代码,它工作得很好,除非您输入类似 2/2/2011 的内容,您会收到错误消息“文档日期不是有效日期”。我希望它会说“文档日期需要采用 MM/DD/YYYY 格式”。

为什么newDate = dateFormat.parse(date); 行没有听懂?

// checks to see if the document date entered is valid
    private String isValidDate(String date) {

        // set the date format as mm/dd/yyyy
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
        Date newDate = null;

        // make sure the date is in the correct format..        
        if(!date.equals("mm/dd/yyyy")) {
            try {
                newDate = dateFormat.parse(date);
            } catch(ParseException e) {
                return "The Document Date needs to be in the format MM/DD/YYYY\n";
            }

            // make sure the date is a valid date..
            if(!dateFormat.format(newDate).toUpperCase().equals(date.toUpperCase())) {
                return "The Document Date is not a valid date\n";
            }

            return "true";
        } else {
            return "- Document Date\n";
        }
    }

编辑:我正在尝试严格遵守格式 MM/DD/YYYY。如何更改代码,以便如果用户输入“2/2/2011”,它将显示消息:“文档日期需要采用 MM/DD/YYYY 格式”?

【问题讨论】:

  • 很多这段代码没有做任何有用的事情。可以提供一个更简单的代码示例,因为我很想删除大部分代码。
  • 2 是一个有效的年份,所以我不希望它产生错误,我希望它格式化为 02/02/0002 这与 2/2/2 甚至 6/1 不一样/2011 将无法通过您的测试。
  • 应该是 2011 年 2 月 2 日。我已经更新了。
  • 这将被格式化为您指定的02/02/2011,因此它不会匹配。
  • 不,不会的。它给出消息“文档日期不是有效日期”。我希望它给出消息“文档日期需要采用 MM/DD/YYYY 格式”。

标签: java date simpledateformat


【解决方案1】:

如前所述,SimpleDateFormat 能够将“2/2/2011”解析为“02/02/2011”。所以不会抛出ParseException

另一方面,dateFormat.format(newDate) 将返回“02/02/2011”并与“2/2/2011”进行比较。两个字符串不相等,所以返回第二条错误信息。

setLenient(false) 在这种情况下不起作用:

月份:如果模式字母的数量为3个或更多,则月份被解释为文本; 否则,它会被解释为一个数字

数字:对于格式化,模式字母的数量是最小位数,较短的数字会被零填充到这个数量。 对于解析,模式字母的数量会被忽略,除非需要分隔两个相邻的字段。

(来源:java docs

您可以使用正则表达式手动检查字符串格式:

if(date.matches("[0-9]{2}/[0-9]{2}/[0-9]{4}")) {
    // parse the date
} else {
    // error: wrong format
}

【讨论】:

  • 那行得通。我一定不明白解析日期实际上做了什么。我认为它验证了它的格式正确。
  • 很遗憾你没有。解析器实际上非常聪明,可以识别最奇怪的字符串。我刚刚成功解析了字符串“0211111/0211111/2011111111”(使用宽松的解析,严格的解析抛出了 ParseException)。这有利于充分利用格式错误的用户输入,但在您的情况下非常糟糕。
  • +1。如果SimpleDateFormat 文档能够澄清SimpleDateFormat#parse() 方法本身的宽松行为,那就太好了,因为它基本上取代了(甚至可能违反了合同)DateFormat#parse() 的文档。也就是说,除非我对“严格”的解释(由 DateFormat#parse() 记录)是错误的。
  • 我也认为严格解析是......好吧......严格。在这种情况下,“严格”似乎意味着“比宽松一点宽松”。我无法找到关于宽松和严格解析的确切区别的定义,只是像this link 这样的例子,我放弃了尝试通过实验来弄清楚。
【解决方案2】:

日期正确,但格式为 02/02/2002

【讨论】:

  • 我知道是这样,这就是问题所在。我希望错误消息显示格式应该是什么,而不是它是无效的日期。
  • 如果我没记错的话,日期甚至是公元 2 年 2 月 2 日,不是吗?
  • @Catfish:那么您必须使用正则表达式检查字符串。如果 SimpleDateFormat 能够解析字符串,它只会在不抛出异常的情况下进行解析。
  • 嗯,这是您返回的错误消息,而不是抛出异常(不抛出异常)
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
  • 2012-03-13
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多