SimpleDateFormat失败

Ana*_*and 2 java

我正在使用下面的例程来验证日期yyyyMMddHHmm格式.所有病例的日常工作除了小时= 02.例如,它适用于:201203110000,201203110100... 201203112300.

我错过了什么?这是SimpleDateFormat中的有效错误,还是应该明确设置格式以使类正常工作.我正在使用JDK 1.6.0_24.

public static void main(String[] args)
{
    SimpleDateFormat dateUtil = new SimpleDateFormat();
    Date parsedDT = null;
    String dateVal = "201203110200";
    String dateFormat = "yyyyMMddHHmm";
    dateUtil.applyPattern(dateFormat);
    try
    {
        parsedDT = dateUtil.parse(dateVal);
        if (!dateUtil.format(parsedDT).equals(dateVal))
        {
            System.err.println("error");
        }
        else
        {
            System.err.println("pass");
        }
    }
    catch (Exception exp)
    {
        exp.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

你没有指定时区SimpleDateFormat,我们不知道你所在的时区 - 但我强烈怀疑这是问题的原因.如果我将代码更改为:我当然可以重现该问题:

SimpleDateFormat dateUtil = new SimpleDateFormat();
dateUtil.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
Run Code Online (Sandbox Code Playgroud)

至少在某些地方(包括美国),2012年3月11日是时钟前进的时间 - 例如在芝加哥,凌晨2点实际上从未发生过.当地时间:

01:59:58
01:59:59
03:00:00
Run Code Online (Sandbox Code Playgroud)

当你试图解析一个从未发生过的日期/时间时,Java并没有给你太多的控制权,但至少你不会得到同样不可能的值也就不足为奇了 - 它可能已经选择了当时的瞬间2am将在没有转换的情况下发生,例如,其将被格式化为201203110300.

至于你应该如何修复它 - 不清楚这些数据来自何处或者你应该考虑它来自哪个时区.也许您应该将格式的时区设置为UTC ......我们不知道.

我也强烈建议使用Joda Time作为一个更好的日期/时间API java.util.*.