2

以下 Java 代码仅2009-01-28-09:11:12使用SimpleDateFormat. 让我们看看它。

final public class Main
{
    public static void main(String[] args)
    {            
        try
        {
            DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            Date d = df.parse("2009-01-28-09:11:12");
            System.out.println(d);
        }
        catch (ParseException ex)
        {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

上述代码显示(解析后)的日期(带时间)如下,

Sun Nov 30 22:07:51 IST 2008

即使我们试图解析日期2009-01-28-09:11:12。它看起来有些不稳定。为什么会这样解析?

4

3 回答 3

5

您的日期格式不应该是这样的:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");

匹配这种格式:

Date d = df.parse("2009-01-28-09:11:12");

?

至于为什么,根据这个:

解析器实际上将这些视为数字,诀窍在于 - 是数字的一部分,表示负数。所以如果你这样做:

df.parse("2009-01-02-00:00:00")

它给:

Mon Dec 01 00:02:00 EST 2008

它将 2009 解析为 yyyy,然后将 -0 解析为 MM(这是上个月,因为月份从 1 开始),然后 1 解析为 dd,等等。

根据 DateFormat 中的解析:

默认情况下,解析是宽松的:如果输入不是该对象的格式方法使用的格式,但仍然可以解析为日期,则解析成功。客户可以通过调用 setLenient(false) 来坚持严格遵守格式。

我想,如果你有一个选项,如果你喜欢像 2009/01/02 12:34:56 这样的格式,最好使用斜杠而不是破折号。这个:

df.parse("2009/01/02-00:00:00")

会抛出异常:

ERROR java.text.ParseException:
Unparseable date: "2009/01/02-00:00:00"

我只能得出结论,这是一件非常好的事情,/它不被 DateFormat 视为数字除法......

于 2012-01-28T17:20:23.693 回答
2

好吧,你可以定义你实际解析的格式......

于 2012-01-28T17:21:05.133 回答
1

默认情况下以宽松模式解析日期。这意味着如果不是闰年,它可以容忍将 2 月 29 日解析为 3 月 1 日的错误。您要求它解析的是 2009 年第 -1 个月的第 -28 天,它尽职尽责地尝试为您提供您所要求的内容。

要关闭此行为,请调用 format.setLenient(false)。然后,如果您尝试解析不是真实日期的内容,则 dateformat 将引发异常。

于 2012-01-28T17:32:32.877 回答