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

Java代码   收藏代码
  1. package com.common.convert;  
  2.   
  3. import java.sql.Date;  
  4. import java.sql.Timestamp;  
  5. import java.text.ParseException;  
  6. import java.text.SimpleDateFormat;  
  7. import java.util.Map;  
  8.   
  9. import ognl.DefaultTypeConverter;  
  10.   
  11. import org.apache.commons.lang.StringUtils;  
  12. import org.apache.commons.lang3.time.DateUtils;  
  13. import org.apache.log4j.Logger;  
  14. /*** 
  15.  * 日期转换器.<br>用于struts2 
  16.  *  
  17.  * @author huangwei 
  18.  * 
  19.  */  
  20. public class DateConverter extends DefaultTypeConverter {  
  21.     private static final Logger logger = Logger.getLogger(DateConverter.class);  
  22.   
  23.     private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";  
  24.     private static final String DATETIME_PATTERN_NO_SECOND = "yyyy-MM-dd HH:mm";  
  25.     private static final String DATETIME_PATTERN_ZH ="yyyy年MM月dd日 HH点mm分ss秒";  
  26.     private static final String DATETIME_PATTERN_ZH2 ="yyyy年MM月dd日 HH时mm分ss秒";  
  27.     private static final String DATE_PATTERN = "yyyy-MM-dd";  
  28.   
  29.     private static final String MONTH_PATTERN = "yyyy-MM";  
  30.   
  31.     /** 
  32.      * Convert value between types 
  33.      */  
  34.     @SuppressWarnings("unchecked")  
  35.     public Object convertValue(Map ognlContext, Object value, Class toType) {  
  36.         Object result = null;  
  37.         // java.sql.Date 是java.util.Date 的子类  
  38.         if (toType == java.util.Date.class) {  
  39.             try {  
  40.                 result = doConvertToDate(value,  toType);  
  41.             } catch (ParseException e) {  
  42.                 e.printStackTrace();  
  43.             }  
  44.         } else if (toType == java.sql.Timestamp.class) {  
  45.             try {  
  46.                 java.util.Date date=doConvertToDate(value, toType);  
  47.                 result = new Timestamp(date.getTime());  
  48.             } catch (ParseException e) {  
  49.                 e.printStackTrace();  
  50.             }  
  51.         } else if (toType == String.class) {  
  52.             result = doConvertToString(value);  
  53.         }  
  54.         return result;  
  55.     }  
  56.   
  57.     /** 
  58.      * Convert String to Date 
  59.      *  
  60.      * @param value 
  61.      * @return 
  62.      * @throws ParseException 
  63.      */  
  64.     private java.util.Date doConvertToDate(Object value,Class toType) throws ParseException {  
  65.         java.util.Date result = null;  
  66.   
  67.         if (value instanceof String) {  
  68.             result = DateUtils.parseDate((String) value, new String[] {DATETIME_PATTERN,  
  69.                     DATE_PATTERN,  MONTH_PATTERN   
  70.                     ,DATETIME_PATTERN_NO_SECOND,DATETIME_PATTERN_ZH,DATETIME_PATTERN_ZH2});  
  71. //          if(toType==java.sql.Timestamp.class){  
  72. //              result=new java.sql.Timestamp(result.getTime());  
  73. //          }  
  74.             // all patterns failed, try a milliseconds constructor  
  75.             if (result == null && StringUtils.isNotEmpty((String) value)) {  
  76.   
  77.                 try {  
  78.                     result = new Date(new Long((String) value).longValue());  
  79.                 } catch (Exception e) {  
  80.                     logger.error("Converting from milliseconds to Date fails!");  
  81.                     e.printStackTrace();  
  82.                 }  
  83.   
  84.             }  
  85.   
  86.         } else if (value instanceof Object[]) {  
  87.             // let's try to convert the first element only  
  88.             Object[] array = (Object[]) value;  
  89.   
  90.             if ((array != null) && (array.length >= 1)) {  
  91.                 value = array[0];  
  92.                 result = doConvertToDate(value,toType);  
  93.             }  
  94.   
  95.         } else if (Date.class.isAssignableFrom(value.getClass())) {  
  96.             result = (Date) value;  
  97.         }  
  98.         return (java.util.Date)result;  
  99.     }  
  100.   
  101.     /** 
  102.      * Convert Date to String 
  103.      *  
  104.      * @param value 
  105.      * @return 
  106.      */  
  107.     private String doConvertToString(Object value) {  
  108.         SimpleDateFormat simpleDateFormat = new SimpleDateFormat(  
  109.                 DATETIME_PATTERN);  
  110.         String result = (String)value;  
  111.         if (value instanceof Date) {  
  112.             result = simpleDateFormat.format(value);  
  113.         }  
  114.         return result;  
  115.     }  
  116. }  

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

date java.lang.IllegalArgumentException: argument type mismatch

Struts2中转换Date类型的问题

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

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

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

 

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

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

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

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

相关文章
|
1月前
|
Java 关系型数据库 MySQL
37、一篇文章学习 Java 中的日期相关类(Date 和 Calendar),非常常用
37、一篇文章学习 Java 中的日期相关类(Date 和 Calendar),非常常用
27 0
|
3月前
|
Java API
Java 8 时间和日期 API
Java 8 时间和日期 API
36 1
|
4月前
|
Java Unix 程序员
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
62 1
|
1月前
|
Java
java中日期处理的一些工具方法
java中日期处理的一些工具方法
17 1
|
3月前
|
数据库 Java
JAVA获取指定日期是星期几
JAVA获取指定日期是星期几
|
1天前
|
安全 Java API
Java日期与时间
Java日期与时间
11 1
|
16天前
|
Java BI
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
Java 获取周,月,年日期集合(统计图)
|
17天前
|
Java
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
java判断时间是否为节假日(或指定的日期),是的话返回true,否返回false
22 0
|
1月前
|
Java
java中,根据指定日期显示出前n天的日期
java中,根据指定日期显示出前n天的日期
9 0
|
1月前
|
Java API
Java 日期和时间 API:实用技巧与示例 - 轻松处理日期和时间
简介 Scanner 类用于获取用户输入,它位于 java.util 包中。 使用 Scanner 类 要使用 Scanner 类,请执行以下步骤: 导入 java.util.Scanner 包。 创建一个 Scanner 对象,并将其初始化为 System.in。 使用 Scanner 对象的方法读取用户输入。
53 1