【问题标题】:Java Date to String parsing / validation help needed需要 Java 日期到字符串解析/验证帮助
【发布时间】:2015-04-13 00:55:49
【问题描述】:

我在将 java 中的日期字段更改为字符串时遇到问题。它在我的输出 toString 中有效,但验证部分无法识别。我的代码有什么问题?除了真正的“M/d/yyyy”日期外,我不能让用户发布任何内容,但我的验证不起作用。想法?

我在下面发布了开始日期代码,“结束日期”代码是相同的,但我认为你应该知道它存在。

非常感谢。

        String stringStartDate = this.txtStartDate.getText();
        SimpleDateFormat formatter = new SimpleDateFormat("M/d/yyyy");
        Date pStartDate = null;

        if (stringStartDate.length() > 0)
        {
            try {
                pStartDate = formatter.parse(stringStartDate);
            } catch (ParseException e1) {
                e1.printStackTrace();
            }

          if (pStartDate == null)
          {
            this.textArea.setText(this.textArea.getText() + "\n"
              + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!");
            return;
          }
        }
        else
        {
          this.textArea.setText(this.textArea.getText() + "\n"
            + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!");
          return;
        }

这是我的 toString()... 这是完美的工作。

    @Override 
    public String toString(){
    return "Pay Period Start Date = " +        simpleDateFormatMonthDayYear.format(this.pStartDate) + "\n" 
            + "Pay Period End Date = " + simpleDateFormatMonthDayYear.format(this.pEndDate) + "\n";

    }

根据 cmets 和我自己的反复试验,我已经改变了一些东西,但现在都不起作用。什么交易?

        SimpleDateFormat simpleDateFormatMonthDayYear = new SimpleDateFormat("M/d/yyyy");
        String stringStartDate = simpleDateFormatMonthDayYear.format(this.txtStartDate.getText());
        Date pStartDate = null;

        if (stringStartDate.length() > 0)
        {
            try {
                pStartDate = simpleDateFormatMonthDayYear.parse(stringStartDate);
            } catch (ParseException e1) {
                e1.printStackTrace();
            }

          if (pStartDate == null)
          {
            this.textArea.setText(this.textArea.getText() + "\n"
              + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!");
            return;
          }
        }
        else
        {
          this.textArea.setText(this.textArea.getText() + "\n"
            + "Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!");
          return;
        }

【问题讨论】:

  • 我注意到一个有效的使用simpleDateFormatMonthDayYear,而一个不使用的formatter。两者的格式是否相同?您是否验证了要解析的输入?您是否使用调试器进入代码?
  • 您是否考虑过使用JFormattedTextFieldJSpinner 代替?他们可以自动执行验证,或者您(假设您使用的是 Swing)
  • @ElliottFrisch 当我更改为 simpleDateFormatMonthDayYear 时,情况似乎变得更糟。思想?我已经完成了跨步调试器,但无济于事。
  • @MadProgrammer JSpinner 是不可能的。我没有为 JFormattedTextFields 工作太多,但如果我不能让它工作,我会开始研究它们。感觉答案就在眼前!

标签: java string validation parsing date


【解决方案1】:

您正在尝试使用SimpleDateFormat 来格式化String ...

SimpleDateFormat simpleDateFormatMonthDayYear = new SimpleDateFormat("M/d/yyyy");
String stringStartDate = simpleDateFormatMonthDayYear.format(field.getText());

这根本没有意义。你想将parseString 值改为Date

您要做的第一件事是将parseString 值设置为Date,这将检查String 的格式是否正确。完成此操作后,您需要检查已解析的 Date 的格式化版本是否与字段中的文本相同,以查看日期是否实际有效...

SimpleDateFormat simpleDateFormatMonthDayYear = new SimpleDateFormat("M/d/yyyy");
try {
    Date date = simpleDateFormatMonthDayYear.parse(field.getText());

    if (date != null) {

        String formatted = simpleDateFormatMonthDayYear.format(date);
        if (!formatted.equals(field.getText())) {

            System.out.println("Date is not valid");

        }

    } else {

        System.out.println("Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!");

    }
} catch (ParseException exp) {

    System.out.println("Error! Please enter a valid start date in the format M/d/yyyy (e.g. 1/2/2015)!");

}

但我只使用 JSpinnerJFormattedTextField 因为它们可以自动验证文本本身,但这只是我(或来自 SwingLabs SwingX 库的 JXDatePicker,因为我就是那么懒)

【讨论】:

  • 谢谢,MadProgrammer。我改变了我的以匹配你的,它似乎正在工作。这似乎已经足够了,但我将开始深入研究 JXDatePicker……这看起来更理想。
  • 很高兴能帮上忙 ;)
【解决方案2】:

您没有告诉我们该方法在哪些测试上失败。我通常在这样的代码中查找错误的方法是进行测试,找到失败的测试输入,使用调试器单步执行它并查看失败的地方。

但是,这里有一个提示。我注意到您正在使用“M/d/yyyy”作为格式。这是有问题的,因为有些月份有两位数,有些天有两位数。为什么不使用“MM/dd/YYYY”?

【讨论】:

  • "为什么不使用 "MM/dd/YYYY"" - 因为在将 String 解析为 Date 和解析器时格式并不重要将考虑存在单个格式键的多个数字,其次,Y 是一年中的一周,而不是一年...
猜你喜欢
  • 2021-01-24
  • 2011-04-06
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多