Wonky约会在爪哇

时间:2012-01-28 17:16:52

标签: java date-parsing

以下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。看起来有点不稳定。为什么要解析呢?

3 个答案:

答案 0 :(得分: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视为数字除法是一件非常好的事情......

答案 1 :(得分:2)

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

答案 2 :(得分:1)

默认情况下,以宽松模式解析日期。这意味着它可以容忍错误,例如如果它不是闰年那么将feb 29解析为mar 1。您要求它解析的是2009年第1个月的第28天,它尽职尽责地试图给您准确的要求。

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

相关问题