日期写入数据库没有时分秒的解决方案
问题描述:
前台使用日期插件,日期格式是:“2016-12-12 09:30”,后台使用struts2的自动表单封装。查看写入数据库的数据,发现只有年月日,没有时分秒。
问题分析:
前台数据是字符串类型(String),实体类中的属性是日期型(java.util.Date),struts2对字符串转日期型,大多数情况下是没有问题的,例如日期格式是:“2016-12-12”、或者“2016-12-12 09:30:00”。但我们的日期格式是“2016-12-12 09:30”,struts2无法很好地识别。
解决方案:
自己提供日期转换类。
1. 编写一个日期转换类,代码如下:
package com.hanhf.oa.meeting.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import ognl.DefaultTypeConverter;
import org.apache.commons.lang.xwork.StringUtils;
import org.apache.commons.lang.xwork.time.DateUtils;
import org.apache.log4j.Logger;
public class DateConverter extends DefaultTypeConverter {
private static final Logger logger = Logger.getLogger(DateConverter.class);
private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
private static final String DATEHOURMINUTE_PATTERN = "yyyy-MM-dd HH:mm";
private static final String DATE_PATTERN = "yyyy-MM-dd";
private static final String MONTH_PATTERN = "yyyy-MM";
/**
* Convert value between types
*/
@SuppressWarnings({ "rawtypes" })
public Object convertValue(Map ognlContext, Object value, Class toType) {
Object result = null;
if (toType == Date.class) {
result = doConvertToDate(value);
} else if (toType == String.class) {
result = doConvertToString(value);
}
return result;
}
/**
* Convert String to Date
*
* @param value
* @return
*/
private Date doConvertToDate(Object value) {
Date result = null;
if (value instanceof String) {
try {
result = DateUtils.parseDate((String) value, new String[] {
DATETIME_PATTERN, DATEHOURMINUTE_PATTERN, DATE_PATTERN,
MONTH_PATTERN });
} catch (ParseException e1) {
}
// all patterns failed, try a milliseconds constructor
if (result == null && StringUtils.isNotEmpty((String) value)) {
try {
result = new Date(new Long((String) value).longValue());
} catch (Exception e) {
logger.error("Converting from milliseconds to Date fails!");
e.printStackTrace();
}
}
} else if (value instanceof Object[]) {
// let's try to convert the first element only
Object[] array = (Object[]) value;
if ((array != null) && (array.length >= 1)) {
value = array[0];
result = doConvertToDate(value);
}
} else if (Date.class.isAssignableFrom(value.getClass())) {
result = (Date) value;
}
return result;
}
/**
* Convert Date to String
*
* @param value
* @return
*/
private String doConvertToString(Object value) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
DATETIME_PATTERN);
String result = null;
if (value instanceof Date) {
result = simpleDateFormat.format(value);
}
return result;
}
}
在这个类中,我们定义了几种常用的日期格式,并在doConvertToDate()方法中调用这几种日期格式进行转换。如果需要,你还可以定义更多的日期格式。
2. 在src目录下新建一个File,命名为:xwork-conversion.properties,文件内容为:
java.util.Date=com.hanhf.oa.meeting.util.DateConverter
这样,等于定义了一个全局设置,以后执行表单自动封装时,只要目标类型是java.util.Date类型,都调用我们自定义的转换类。