我创建了一个类来接收一个带有日期的对象,并通过一个方法来验证日期是否写对了。问题是我的代码无法正确验证字符。
下面是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";
}
}
}
2条答案
按热度按时间lsmepo6l1#
我只想指出,这种事情是一个坏主意,但是,既然你只是比较“格式”与“固定格式”,我不会继续疯狂咆哮。
格式是固定的。从字符位置2和5开始,检查它们是否是
/
字符,如果是,你可以在这些字符上拆分字符串,然后简单地做一个String
到int
的会话测试。哦,letter == "/"
不是你比较String
的方法,更多细节请参见How do I compare strings in Java?-尽管,我会比较character
核心问题(除了错误地比较
String
之外)是在循环中将isADate
重置为true
你应该假设格式是正确的,只有当它不正确时才改变
isADate
(到false
)--永远不要在循环中把它设置回true
。你还应该在证明格式不正确后退出循环。比如说...
gxwragnw2#
Answer by MadProgrammer是正确和明智的。
使用
DateTimeFormatter
进行解析验证日期的更好方法是定义一个
DateTimeFormatter
,其格式模式与预期输入相匹配。尝试分析实际输入。
DateTimeParseException
陷阱指示输入不符合预期。ISO 8601标准
最终的解决方案是让数据发布者了解在以文本方式交换日期-时间值时只使用标准ISO 8601的好处。
避免以本地化或发明的格式交换数据。标准格式旨在使机器易于分析,并使人类易于跨各种区域性阅读。标准格式旨在避免歧义。
Java 8+中的 java.time 类在解析/生成文本时默认使用标准ISO 8601格式。
纯日期值的标准格式为YYYY-MM-DD,例如
2023-12-03
。请注意年-月-日的逻辑:大的,中的,最小的。而且这些文本当按字母顺序排序时也是按时间顺序的。Jakarta Bean验证
您可能会发现Jakarta Bean Validation 3.0作为验证数据输入的一种方法非常有用。