现象描述:
打算将由BeanUtils的getProperty方法返回的Date类型的字符串表示重新通过SimpleDateFormat转换成Date类型的对象老是失败,抛ParseException异常.
分析:
调用commons项目里的BeanUtils对象里的getProperty方法返回某个对象中的Date类型的成员变量.BeanUtil中对getProperty方法的描述如下:
Return the value of the specified property of the specified bean, no matter which property reference format is used, as a String.
也就是说,无论这个成员变量的类型是什么,经由getProperty方法返回的值都将是一个字符串.
如果这个成员变量的类型是java.util.Date,那么BeanUtils会调用一个专门为Date类型准备的converter来对这个Date进行转换,其实最终是调用了Date的toString方法.
在某些特殊的时候,我们需要将这个字符串表示的Date还原成真正的Date类,以备后用.
如果抛出异常,则肯定是由于转换格式的不匹配造成的.
解决过程及成果:
查阅JDK的manual,找到Date类的toString方法,其中描述说所有的Date类都将被转换成形如"dow mon dd hh:mm:ss zzz yyyy"的形式,"dow,mon"是什么?从表面上看,似乎是"E"和"MMM",由debug的跟踪结果来看,确实像是"E MMM dd hh:mm:ss zzz yyyy".
但是,以上述的格式对字符串进行转换,照样出错.没办法,直接冲入JDK源码,查看Date类的toString方法:
public String toString() {
// "EEE MMM dd HH:mm:ss zzz yyyy";
BaseCalendar.Date date = normalize();
StringBuilder sb = new StringBuilder(28);
int index = date.getDayOfWeek();
if (index == gcal.SUNDAY) {
index = 8;
}
convertToAbbr(sb, wtb[index]).append(' '); // EEE
convertToAbbr(sb, wtb[date.getMonth() - 1 + 2 + 7]).append(' '); // MMM
CalendarUtils.sprintf0d(sb, date.getDayOfMonth(), 2).append(' '); // dd
CalendarUtils.sprintf0d(sb, date.getHours(), 2).append(':'); // HH
CalendarUtils.sprintf0d(sb, date.getMinutes(), 2).append(':'); // mm
CalendarUtils.sprintf0d(sb, date.getSeconds(), 2).append(' '); // ss
TimeZone zi = date.getZone();
if (zi != null) {
sb.append(zi.getDisplayName(date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz
} else {
sb.append("GMT");
}
sb.append(' ').append(date.getYear()); // yyyy
return sb.toString();
}
这一眼就看出它的日期格式确实是用的"EEE MMM dd HH:mm:ss zzz yyyy"(都不用读代码,人家注释里直接告诉你了),这么说我最初判断它的格式字符串并没有错,确实是"E MMM dd hh:mm:ss zzz yyyy"(E的个数在1-3之间是没有区别的),那么到底问题在哪呢?
没办法,那么干脆照着"E MMM dd hh:mm:ss zzz yyyy"的格式,亲手把一个Date对象转换一下,看看出来是什么样子:
public static void main(String args[]) {
Calendar c = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("E MMM dd hh:mm:ss z yyyy");
System.out.println(format.format(c.getTime()));
}
输出结果:"星期日 十一月 04 05:03:52 CST 2007"
好了,至此,可以恍然大悟了.原来是因为我们是中国人,身在中国,Java库的开发人员十分体贴我们,充满人性关怀地将SimpleDateFormat类使用的Locale默认成了我们所在位置的Locale,输出了符合我们中国人习惯的日期表示方式.然而,却没有在Date的toString方法里做同样的人性化设定,toString方法一律输出美国的时间字符串格式"Sun Nov 04 17:10:26 CST 2007".无奈中美语言不通,这样你来我往转换一个回合,不出错才叫怪了.
解决方法很简单,就是在构造SimpleDateFormat对象时使用两个参数的构造函数,将Locale指定为US,就可以了:
SimpleDateFormat format = new SimpleDateFormat("E MMM dd hh:mm:ss z yyyy", Locale.US);
完结.
分享到:
相关推荐
把对象转换成json字符串的实例,包括单独的对象、List、对象和List混合。MyEclipse工程,里面包括五个Jar包:commons-beanutils-1.8.0.jar,commons-collections-3.2.1.jar,commons-lang-2.4.jar,commons-logging-...
BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把...还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是讲字符串类型转换为各种具体的数据类型,就是用beanutils工具
使用 JsonArray将对象转成json字符串时需要的相关jar包 json-lib-2.4-jdk15.jar commons-beanutils-1.8.0.jar commons-collections-3.2.2.jar commons-lang-2.6.jar commons-logging-1.2.jar ezmorph-1.0.6.jar
JSON 字符串 与 java 对象的转换 包括说明代码和需要的jar包 commons-beanutils-1.7.0.jar commons-lang-2.1.jar ezmorph-1.0.2.jar json-lib-1.1-jdk15.jar 之前找了一些,说是只需要引入json-lib-1.1-jdk15.jar...
BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。使用第三方工具,需要导入jar包:
3.Converter 把Request或ResultSet中的字符串绑定到对象的属性 4.1 PropertyUtils,当属性为Collection,Map时的动态读取 4.2 PropertyUtils,获取属性的Class类型 4.3 ConstructorUtils,动态创建对象 4.4 ...
BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。beanUtils 可以便于对javaBean的属性、对象进行赋值,beanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中。
BeanUtils用法
BeanUtils是由Apache公司开发的针对操作JavaBean的工具包。 对于JavaBean,简单的来说,就是要有一个空参的构造器和对属性的getXXX方法和setXXX方法。 在由JDK提供的默认的API中,有java.beans包,里面有诸如...
增加了BeanUtils的copyProperty以及copyProperties方法对Date的null值复制功能,取消了当Date为null时的抛异常。 2008-08-25更新: 修改了Date转换为String的时候只能转换为短日期格式的问题,现在默认情况下都修改...
BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中
一般情况下,在写一个Bean时,我们都要写上getXX和setXX方法,这样在读取和写入对象属性值时很方便,但有些场合下,比如动态访问Java对象属性时,上面的写法就不合适了,这样的一些场景例如: 1、当创建脚本语言与...
BeanUtils教程BeanUtils教程BeanUtils教程BeanUtils教程BeanUtils教程BeanUtils教程
BeanUtils_1.8.3最新帮助文档,希望对给位有用。。。
赠送jar包:commons-beanutils-1.9.4.jar; 赠送原API文档:commons-beanutils-1.9.4-javadoc.jar; 赠送源代码:commons-beanutils-1.9.4-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.9.4.pom; ...
赠送jar包:commons-beanutils-1.9.4.jar; 赠送原API文档:commons-beanutils-1.9.4-javadoc.jar; 赠送源代码:commons-beanutils-1.9.4-sources.jar; 赠送Maven依赖信息文件:commons-beanutils-1.9.4.pom; ...
前台字符串赋值给JavaBean属性自动类型转换的实现(BeanUtils,ConverterConvertUtils三个类的使用)
两个jar,一个是beanutils,另一个是logging,用来封装javabean对象!!!!!!
BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包
commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包