SimpleDateFormat无法正常工作

时间:2014-11-14 06:41:40

标签: java datetime simpledateformat

我的程序中有以下代码,用于将给定日期转换为不同的日期格式。

public static final List < SimpleDateFormat > dateFormats = new ArrayList < SimpleDateFormat > () {
    {
        add(new SimpleDateFormat("M/dd/yyyy"));
        add(new SimpleDateFormat("dd.M.yyyy"));
        add(new SimpleDateFormat("dd.MMM.yyyy"));
        add(new SimpleDateFormat("dd-MMM-yyyy"));
        add(new SimpleDateFormat("yyyy-MM-dd"));
        add(new SimpleDateFormat("M/dd/yyyy HH:mm"));
        add(new SimpleDateFormat("dd.M.yyyy HH:mm"));
        add(new SimpleDateFormat("dd.MMM.yyyy HH:mm"));
        add(new SimpleDateFormat("dd-MMM-yyyy HH:mm"));
        add(new SimpleDateFormat("yyyy-MM-dd HH:mm"));
    }
};

public static Date convertToDate(String input) {
    Date date = null;
    if (null == input) {
        return null;
    }
    for (SimpleDateFormat format: dateFormats) {
        try {
            format.setLenient(false);
            date = format.parse(input);
        } catch (ParseException e) {}
        if (date != null) {
            break;
        }
    }

    return date;
}

但是在更改日期格式后运行上面的代码时,时间将重置为零。问题是什么?

3 个答案:

答案 0 :(得分:1)

您的缩进有点偏差,您不应该使用Raw Types来回答您的问题您需要在没有时间的格式之前测试格式(如果您想要保持解析的时间)。

public static final List<DateFormat> dateFormats = new ArrayList<DateFormat>()
{
    {
        add(new SimpleDateFormat("M/dd/yyyy HH:mm"));
        add(new SimpleDateFormat("dd.M.yyyy HH:mm"));
        add(new SimpleDateFormat("dd.MMM.yyyy HH:mm"));
        add(new SimpleDateFormat("dd-MMM-yyyy HH:mm"));
        add(new SimpleDateFormat("yyyy-MM-dd HH:mm"));
        add(new SimpleDateFormat("M/dd/yyyy"));
        add(new SimpleDateFormat("dd.M.yyyy"));
        add(new SimpleDateFormat("dd.MMM.yyyy"));
        add(new SimpleDateFormat("dd-MMM-yyyy"));
        add(new SimpleDateFormat("yyyy-MM-dd"));
    }
};

最后,我建议您在第一次成功解析时返回(而不是稍后退出循环) -

public static Date convertToDate(String input) {
    if (input == null) {
        return null;
    }
    for (SimpleDateFormat format : dateFormats) {
        try {
            format.setLenient(false);
            return format.parse(input);
        } catch (ParseException e) {
        }
    }    
    return null; // <-- nothing parsed.
}

修改

此外,正如Bohemian所指出here;如果您使用多个线程,则应使用String格式重新创建DateFormat,因为SimpleDateFormat不是线程安全的。

public static final String[] dateFormats = { "M/dd/yyyy HH:mm",
        "dd.M.yyyy HH:mm", "dd.MMM.yyyy HH:mm", "dd-MMM-yyyy HH:mm",
        "yyyy-MM-dd HH:mm", "M/dd/yyyy", "dd.M.yyyy", "dd.MMM.yyyy",
        "dd-MMM-yyyy", "yyyy-MM-dd" };

public static Date convertToDate(String input) {
    Date date = null;
    if (null == input) {
        return null;
    }
    for (String fmt : dateFormats) {
        try {
            DateFormat format = new SimpleDateFormat(fmt);
            format.setLenient(false);
            date = format.parse(input);
            break;
        } catch (ParseException e) {
        }
    }
    return date;
}

答案 1 :(得分:0)

我不能肯定这是你的问题,但我可以说你的代码不是线程安全的,因为SimpleDateFormat不是线程安全的。

例如,如果HttpRequestHandler使用此代码来处理Web请求,您将获得不可预测的行为 - 包括您可能正在看到的内容。

最安全的方法是将格式(字符串)存储在数组中,并根据需要创建SimpleDateFormat对象

答案 2 :(得分:0)

我猜你是说当你传递像1/11/12 13:14这样的输入时,你的时间被重置为零,如果这种情况只是重新排序你的格式堆

public static final List<DateFormat> dateFormats = new ArrayList<DateFormat>()
{
    {
        add(new SimpleDateFormat("M/dd/yyyy HH:mm"));
        add(new SimpleDateFormat("dd.M.yyyy HH:mm"));
        add(new SimpleDateFormat("dd.MMM.yyyy HH:mm"));
        add(new SimpleDateFormat("dd-MMM-yyyy HH:mm"));
        add(new SimpleDateFormat("yyyy-MM-dd HH:mm"));
        add(new SimpleDateFormat("M/dd/yyyy"));
        add(new SimpleDateFormat("dd.M.yyyy"));
        add(new SimpleDateFormat("dd.MMM.yyyy"));
        add(new SimpleDateFormat("dd-MMM-yyyy"));
        add(new SimpleDateFormat("yyyy-MM-dd"));
    }
};

public static final List<SimpleDateFormat> dateFormats = new ArrayList<SimpleDateFormat>()
    {
      {
        add(new SimpleDateFormat("M/dd/yyyy HH:mm"));
        add(new SimpleDateFormat("dd.M.yyyy HH:mm"));
        add(new SimpleDateFormat("dd.MMM.yyyy HH:mm"));
        add(new SimpleDateFormat("dd-MMM-yyyy HH:mm"));
        add(new SimpleDateFormat("yyyy-MM-dd HH:mm"));
        add(new SimpleDateFormat("M/dd/yyyy"));
        add(new SimpleDateFormat("dd.M.yyyy"));
        add(new SimpleDateFormat("dd.MMM.yyyy"));
        add(new SimpleDateFormat("dd-MMM-yyyy"));
        add(new SimpleDateFormat("yyyy-MM-dd"));
      }
    };

首先使用基于时间的模式,然后仅使用基于日期的模式,我猜你得到一个基于日期的模式的成功匹配,并返回输出给你的时间为0