java日期转化_java 日期转化

关于日期转化的 文章很多.我只要讲讲我遇到的一些与日期转化有关的问题.

大约1年前,我遇到过一个很令人郁闷又费解的问题.

项目使用的是struts2框架,表单中有日期,提交表单时总是报错,说日期转化有问题,没能马上找到原因.

过了很长时间,才搞清楚关键之所在,有一个日期格式是:"yyyy-MM-ddTHH:mm:ss".

日期和时间之间使用T 分割,而不是采用我们熟知的空格来分割."yyyy-MM-ddTHH:mm:ss"是美国一种的日期格式,中文中是没有这种日期格式的.

我当时使用的浏览器是IE,碰巧当时IE浏览器的语言被设置成了英语,所以提交表单时struts2按照yyyy-MM-ddTHH:mm:ss来解析,但是我表单中日期的格式却是""yyyy-MM-dd HH:mm:ss"",所以就报错了.

怎么办呢?不是仅仅把浏览器的语言设置成为中文就OK 了,因为这没有彻底解决问题.

我的方法是编写一个自定义的日期转化Converter,当然得继承struts2的ognl.DefaultTypeConverter

package com.common.convert;

import java.sql.Date;

import java.sql.Timestamp;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Map;

import ognl.DefaultTypeConverter;

import org.apache.commons.lang.StringUtils;

import org.apache.commons.lang3.time.DateUtils;

import org.apache.log4j.Logger;

/***

* 日期转换器.
用于struts2

*

* @author huangwei

*

*/

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 DATETIME_PATTERN_NO_SECOND = "yyyy-MM-dd HH:mm";

private static final String DATETIME_PATTERN_ZH ="yyyy年MM月dd日 HH点mm分ss秒";

private static final String DATETIME_PATTERN_ZH2 ="yyyy年MM月dd日 HH时mm分ss秒";

private static final String DATE_PATTERN = "yyyy-MM-dd";

private static final String MONTH_PATTERN = "yyyy-MM";

/**

* Convert value between types

*/

@SuppressWarnings("unchecked")

public Object convertValue(Map ognlContext, Object value, Class toType) {

Object result = null;

// java.sql.Date 是java.util.Date 的子类

if (toType == java.util.Date.class) {

try {

result = doConvertToDate(value, toType);

} catch (ParseException e) {

e.printStackTrace();

}

} else if (toType == java.sql.Timestamp.class) {

try {

java.util.Date date=doConvertToDate(value, toType);

result = new Timestamp(date.getTime());

} catch (ParseException e) {

e.printStackTrace();

}

} else if (toType == String.class) {

result = doConvertToString(value);

}

return result;

}

/**

* Convert String to Date

*

* @param value

* @return

* @throws ParseException

*/

private java.util.Date doConvertToDate(Object value,Class toType) throws ParseException {

java.util.Date result = null;

if (value instanceof String) {

result = DateUtils.parseDate((String) value, new String[] {DATETIME_PATTERN,

DATE_PATTERN, MONTH_PATTERN

,DATETIME_PATTERN_NO_SECOND,DATETIME_PATTERN_ZH,DATETIME_PATTERN_ZH2});

//if(toType==java.sql.Timestamp.class){

//result=new java.sql.Timestamp(result.getTime());

//}

// 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,toType);

}

} else if (Date.class.isAssignableFrom(value.getClass())) {

result = (Date) value;

}

return (java.util.Date)result;

}

/**

* Convert Date to String

*

* @param value

* @return

*/

private String doConvertToString(Object value) {

SimpleDateFormat simpleDateFormat = new SimpleDateFormat(

DATETIME_PATTERN);

String result = (String)value;

if (value instanceof Date) {

result = simpleDateFormat.format(value);

}

return result;

}

}

还要进行一些配置,具体参见:

这里我要强调一点:我之所以写converter是为了根本上解决问题,这样不管浏览器是什么语言都不用担心了.

我推荐使用org.apache.commons.lang3.time.DateUtils 来进行日期转化,为什么呢?

我们看到org.apache.commons.lang3.time.DateUtils 的第二个参数是一个数组,意思就是我循环的从数组中拿出一个pattern进行parse,直到解析成功为止.其实这就是一种容错的思维,非常好的思维.

后来在spring MVC中也遇到了关于日期转化的问题

场景:更新的时候,需要把日期放到表单的隐藏域中,但是如果日期为空的话,提交就报错,大概意思:

can not convert String "" to Date.根本原因是隐藏域的值为空.

所以解决方法:也是写一个转化器,如果日期字符串为空,则返回空就完了,不必报错.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值