用Java实现日期校验

brtdzjyr  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(127)

我创建了一个类来接收一个带有日期的对象,并通过一个方法来验证日期是否写对了。问题是我的代码无法正确验证字符。
下面是main函数调用的对象:

hoje.constructor("12/03/2023"); //right date
 amanha.constructor("0//03/2003"); //wrong date

下面是Date类中的方法constructor():

public void constructor(String dateInsert){

        if (dateInsert.length() != 10){
            this.date = "01/01/0001";
        } else {
            boolean isADate = true;
            for(int i = 0 ; i < dateInsert.length() ; i++){
                char c = dateInsert.charAt(i);
                String letter = "" + c;
                
                if(Character.isDigit(c) == false && letter == "/"){
                    if(i != 2 || i != 5){
                        isADate = false;
                    } else {
                        isADate = true;
                    }
                } else {
                    isADate = true;
                }
            }

            if(isADate == true){
                this.data = dateInsert;
            } else {
                this.data = "01/01/0001";
            }
        }     
  }
lsmepo6l

lsmepo6l1#

我只想指出,这种事情是一个坏主意,但是,既然你只是比较“格式”与“固定格式”,我不会继续疯狂咆哮。
格式是固定的。从字符位置2和5开始,检查它们是否是/字符,如果是,你可以在这些字符上拆分字符串,然后简单地做一个Stringint的会话测试。哦,letter == "/"不是你比较String的方法,更多细节请参见How do I compare strings in Java?-尽管,我会比较character
核心问题(除了错误地比较String之外)是在循环中将isADate重置为true
你应该假设格式是正确的,只有当它不正确时才改变isADate(到false)--永远不要在循环中把它设置回true。你还应该在证明格式不正确后退出循环。
比如说...

boolean isADate = true;
for (int i = 0; i < dateInsert.length(); i++) {
    char c = dateInsert.charAt(i);

    if (i == 2 || i == 5) {
        if (c != '/') {
            isADate = false;
            break;
        }
    } else if (!Character.isDigit(c)) {
        isADate = false;
        break;
    }
}
gxwragnw

gxwragnw2#

Answer by MadProgrammer是正确和明智的。

使用DateTimeFormatter进行解析

验证日期的更好方法是定义一个DateTimeFormatter,其格式模式与预期输入相匹配。

DateTimeFormatter f = DateTimeForatter.ofPattern( "MM/dd/uuuu" ) ;

尝试分析实际输入。DateTimeParseException陷阱指示输入不符合预期。

try {
    LocalDate ld = LocalDate.parse( input , f ) ;
} catch ( DateTimeParseException e ) {
    … handle faulty input
}

ISO 8601标准

最终的解决方案是让数据发布者了解在以文本方式交换日期-时间值时只使用标准ISO 8601的好处。
避免以本地化或发明的格式交换数据。标准格式旨在使机器易于分析,并使人类易于跨各种区域性阅读。标准格式旨在避免歧义。
Java 8+中的 java.time 类在解析/生成文本时默认使用标准ISO 8601格式。
纯日期值的标准格式为YYYY-MM-DD,例如2023-12-03。请注意年-月-日的逻辑:大的,中的,最小的。而且这些文本当按字母顺序排序时也是按时间顺序的。

Jakarta Bean验证

您可能会发现Jakarta Bean Validation 3.0作为验证数据输入的一种方法非常有用。

相关问题