我的程序中有以下代码,用于将给定日期转换为不同的日期格式。
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;
}
但是在更改日期格式后运行上面的代码时,时间将重置为零。问题是什么?
答案 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