2

我正在使用下面的例程来验证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();
    }
}
4

1 回答 1

6

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

SimpleDateFormat dateUtil = new SimpleDateFormat();
dateUtil.setTimeZone(TimeZone.getTimeZone("America/Chicago"));

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

01:59:58
01:59:59
03:00:00

当您尝试解析从未发生过的日期/时间时,Java 并没有让您对发生的事情有太多控制,但至少您没有得到相同的不可能值也就不足为奇了——它很可能选择了当凌晨 2 点会在没有过渡的情况下发生,然后会被格式化为 201203110300 例如。

至于你应该如何修复它 - 目前尚不清楚这些数据来自哪里或你应该认为它来自哪个时区。也许您应该将格式的时区设置为 UTC……我们不知道。

我还强烈建议使用Joda Time作为比java.util.*.

于 2012-11-01T06:54:07.227 回答