【问题标题】:parse check doesn't work解析检查不起作用
【发布时间】:2014-02-03 15:03:28
【问题描述】:

大家好,我正在使用这种方法来检查字符串是否可以转换为日期,但似乎它不起作用,这是我编写的代码,用户以这种格式输入日期 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 这样的值,这显然不是日期格式

【问题讨论】:

  • 可能是"dd/MM/YYYY".length()?

标签: java string date


【解决方案1】:

您的 if 条件似乎是错误的...应该是这样。

 if (dateString.length() != "dd/MM/YYYY".length())    return false; 

如果输入日期是 22/07/1986 显然它的长度将超过 ddMMYYYY 的长度,因为缺少斜杠。

df.setLenient(false); 将确保它不会因无效日期而翻转。只需在创建 df 对象后输入这一行。

【讨论】:

  • +1,但实际上你根本不需要那个条件,对吧?
  • thanks 现在适用于某个部分,但现在它接受诸如 54/20/2013 之类的值
  • @tobias_k 当然我也不会写那个条件,我只是指出问题。
  • @TheBigBoss 在我更新答案时使用 setLenient 来解决您使用无效日期的问题。
  • 我刚刚在创建 df 对象后插入了该 cmd,但它仍然无法使用无效日期
【解决方案2】:

这是您应该使用静态最终定义而不是在整个代码中重复相同字符串的一个很好的理由。您正在与一个字符串进行比较并与另一个字符串进行解析,因此两者永远不会匹配。

我也不明白你为什么要通过 SimpleDateFormat 来解析日期(其中有诸如年、月等可用作方法调用的内容)然后将其丢弃以便再次手动解析字符串。

只需将isValidDate 重命名为parseDate,让它返回一个 Date 对象,如果无效则返回 null,并且只要返回的 Date 为 null,就让 while 循环继续。

【讨论】:

  • 因为我的类构造函数分别采用整数来创建一个以这些整数作为字段的新日期,所以在我的第一次尝试中,我的构造函数采用了日期,但采用日期直接导致我存储错误的日期弃用,因为我不能将 1900 分到年和 1 到月
【解决方案3】:

一方面,您希望在大多数地方用/ 分隔您的日期,但您要检查字符串的长度是否与"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;
    }
}

【讨论】:

  • 修复了该错误,但现在它将 54/12/3013 之类的值作为好日期
  • 从技术上讲,这是宽松模式下的有效日期。你可能想试试df.setLenient(false)
  • 插入了但仍然是同样的问题
【解决方案4】:

对于最后一个问题,我提到了 54/77/4444 之类的值,我将 YYYY 更改为 yyyy 并且它起作用了

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多