大家好我正在使用这种方法检查字符串是否可以转换为日期,但似乎它不起作用,这是我写的代码,用户以这种格式输入日期dd / MM / YYYY然后这是检查它发生的事情
...
String date = JOptionPane.showInputDialog(frame,"Insert Date:");
if (date ==null) { return;}
while (!(isValidDate(date))) {
JOptionPane.showMessageDialog(frame, "Incorrect Date");
date = JOptionPane.showInputDialog(frame,"Insert Date:");
if (date ==null) { return;} }
String[] parts = date.split("/");
int year = Integer.parseInt(parts[2]);
int month = Integer.parseInt(parts[1]);
int day = Integer.parseInt(parts[0]);
...
这是检查日期的方法
public boolean isValidDate(String dateString) {
SimpleDateFormat df = new SimpleDateFormat("dd/MM/YYYY");
if (dateString.length() != "ddMMYYYY".length()) {
return false; }
try {
df.parse(dateString);
return true;
} catch (ParseException e) {
return false;
}
这似乎不起作用因为它总是进入while块,无论我在输入中插入什么,这段代码有什么问题?
修改
修复了条件
的错误if (dateString.length() != "ddMMYYYY".length())
现在我又遇到了另一个问题,它接受像54/12/2030这样的值,而且它们不是日期格式
答案 0 :(得分:2)
你的if条件似乎是错的......这应该是这样的。
if (dateString.length() != "dd/MM/YYYY".length()) return false;
如果输入日期是22/07/1986,显然它的长度将超过ddMMYYYY的长度,因为缺少斜杠。
df.setLenient(false);
将确保它不会因无效日期而翻转。在创建df对象后,只需输入thiss行。
答案 1 :(得分:1)
这是为什么你应该使用静态最终定义而不是在整个代码中重复相同字符串的一个很好的理由。你正在比较一个字符串并解析另一个字符串,所以这两个字符串永远不会匹配。
我也不明白为什么你会通过SimpleDateFormat来解析一个Date(它有像年,月等一样的东西可用作方法调用),然后扔掉它以便再次手工解析String。
只需将isValidDate
重命名为parseDate
,让它返回Date对象,如果无效则返回null,并且只要返回的Date为null,就使while循环继续。
答案 2 :(得分:0)
首先,您希望在大多数地方将日期分隔为/
,但要检查字符串是否与"ddMMYYYY"
的长度相同。您应该更改isValidDate()
方法以包含斜杠(以及尾随的近括号):
public boolean isValidDate(String dateString) {
SimpleDateFormat df = new SimpleDateFormat("dd/MM/YYYY");
if (dateString.length() != "dd/MM/YYYY".length()) {
return false;
}
try {
df.parse(dateString);
return true;
} catch (ParseException e) {
return false;
}
}
答案 3 :(得分:0)
对于最后一个问题,我指的是像54/77/4444这样的值,我将YYYY更改为yyyy并且有效