当前位置: 首页 > 知识库问答 >
问题:

为什么SimpleDateFormat。是否接受无效的日期字符串?

闻人杰
2023-03-14

我有一个java代码,以特定的格式输入日期。

static Date parseDate(String userInput){
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = null;
        try {
            date = format.parse(userInput);
            System.out.println(date);
        }catch(ParseException pe){
            date=null;
            System.out.println("Not a valid date");
        }
        return date;
    }

现在我输入的是无效日期。但它返回的日期是2016年1月14日星期四18:31:30。为什么会这样?如何使其返回null作为日期?

共有2个答案

华森
2023-03-14

我将试图解释为什么会发生这种情况。

日期是不同的,因为超过字段最大值的值被卷到下一个更大的字段中。

我不确定解决问题的顺序,但一般情况是这样的:

鉴于2015-13-11 89:90:90

  1. 这一年被解释为2015年,这是正确的。目前2015-01-01 00:00:00
  2. 月份被解释为13,13/MONTHS_IN_A_YEAR=1,所以增加了一年,我们将月份设置为1(13个月-1年)。目前2016-01-01 00:00:00
  3. 日期解释为11。这是正确设置的。目前2016-01-11 00:00:00
  4. 小时被解释为89,89/HOURS_IN_A_DAY=3,所以增加了3天,我们将小时设置为17(89小时-3天)。目前2016-01-14 17:00:00
  5. 分钟被解释为90,90/MINUTES_IN_A_HOUR=1,所以增加了1小时,我们将分钟设置为30(90分钟-1小时)。目前2016-01-14 18:30:00
  6. 秒被解释为90,90/SECONDS_IN_A_MINUTE=1,所以增加了1分钟,我们将秒设置为30(90秒-1分钟)。

这就给我们留下了2016-01-14 18:31:30。

姜天宇
2023-03-14

从javadocs的一瞥来看,它似乎使用了一种宽松的解析模式,在这种模式下,它接受格式不良的输入:

添加此行

format.setLenient(false);

在初始化DateFormat对象之后,它似乎可以修复它。

 类似资料:
  • 我想验证用户输入的日期是否有效,格式是否正确。我使用这个块来检查用户的输入,但是当我输入无效日期时,print语句会给我奇怪的输出。 当是时,它打印

  • 问题内容: SimpleDateFormat: 抛出的异常: 有任何想法吗? 编辑: 感谢您的快速解答。你们都是正确的,我只是错过了SimpleDateFormat文档中的一个关键句子-我可能应该把它称为一天。 问题答案: 从SimpleDateFormat javadocs : 月:如果图案字母的数目为3或更多,则将月份解释为文本;否则,将其解释为数字。 尝试使用“ MMM dd yyyy”之类

  • 我想验证用户输入的日期是否有效,格式是否正确。我使用这个块来检查用户的输入,但是当我输入一个无效的日期时,打印语句会给我奇怪的输出。 当是时,它打印

  • 我有一个包含日期的字符串,我需要将hh:mm:ss添加到日期中,但是当我使用dateFormat时,它会给出ParseException。代码如下: 我得到了abv代码的解析异常。但是,如果我从日期格式中删除hh:mm:ss,它工作得很好,输出将是from Date=Wed Sep 25 00:00:00 IST 2013。但我需要像from date=2013-09-25 00:00:00这样的

  • 我正面临一个前所未有的奇怪问题。我有一个以毫秒为单位的日期,希望将其显示为可读的日期。这是我的代码: 如你所见,我只想创建一个显示时间跨度的字符串。当我调试代码时,日期对象包含正确的值,而

  • 对于上面的代码,获取输出,我期望的是。有人能解释为什么会发生这种情况,以及如何使用验证上面的日期吗。感谢你的努力。