`
pf_miles
  • 浏览: 131798 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

将由BeanUtils的getProperty方法返回的Date对象的字符串表示还原为对象

    博客分类:
  • Java
阅读更多

现象描述:

打算将由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字符串(包括jar包)

    把对象转换成json字符串的实例,包括单独的对象、List、对象和List混合。MyEclipse工程,里面包括五个Jar包:commons-beanutils-1.8.0.jar,commons-collections-3.2.1.jar,commons-lang-2.4.jar,commons-logging-...

    commons-beanutils-1.9.3

    BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把...还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是讲字符串类型转换为各种具体的数据类型,就是用beanutils工具

    使用 JsonArray将对象转成json字符串时需要的相关jar包

    使用 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 对象的转换

    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_beanutils_

    BeanUtils 是 Apache commons组件的成员之一,主要用于简化JavaBean封装数据的操作。它可以给JavaBean封装一个字符串数据,也可以将一个表单提交的所有数据封装到JavaBean中。使用第三方工具,需要导入jar包:

    commons-beanutils-1.9.1解析javaBean方式

    3.Converter 把Request或ResultSet中的字符串绑定到对象的属性 4.1 PropertyUtils,当属性为Collection,Map时的动态读取 4.2 PropertyUtils,获取属性的Class类型 4.3 ConstructorUtils,动态创建对象 4.4 ...

    BeanUtils工具

    BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。beanUtils 可以便于对javaBean的属性、对象进行赋值,beanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中。

    BeanUtils用法

    BeanUtils用法

    beanutils-1.9.3-bin

    BeanUtils是由Apache公司开发的针对操作JavaBean的工具包。 对于JavaBean,简单的来说,就是要有一个空参的构造器和对属性的getXXX方法和setXXX方法。 在由JDK提供的默认的API中,有java.beans包,里面有诸如...

    commons-beanutils-jesse.zip(20080825更新)

    增加了BeanUtils的copyProperty以及copyProperties方法对Date的null值复制功能,取消了当Date为null时的抛异常。 2008-08-25更新: 修改了Date转换为String的时候只能转换为短日期格式的问题,现在默认情况下都修改...

    BeanUtils包

    BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中

    commons-beanutils-1.8.3 API.chm

    一般情况下,在写一个Bean时,我们都要写上getXX和setXX方法,这样在读取和写入对象属性值时很方便,但有些场合下,比如动态访问Java对象属性时,上面的写法就不合适了,这样的一些场景例如: 1、当创建脚本语言与...

    BeanUtils教程

    BeanUtils教程BeanUtils教程BeanUtils教程BeanUtils教程BeanUtils教程BeanUtils教程

    BeanUtils_1.8.3帮助文档

    BeanUtils_1.8.3最新帮助文档,希望对给位有用。。。

    commons-beanutils-1.9.4-API文档-中文版.zip

    赠送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; ...

    commons-beanutils-1.9.4-API文档-中英对照版.zip

    赠送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属性自动类型转换

    前台字符串赋值给JavaBean属性自动类型转换的实现(BeanUtils,ConverterConvertUtils三个类的使用)

    beanutils-logging.zip

    两个jar,一个是beanutils,另一个是logging,用来封装javabean对象!!!!!!

    BeanUtils所需的包

    BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包BeanUtils的包

    commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包

    commons-beanutils-1.8.0.jar beanutils.jar beanutils.jar工具包

Global site tag (gtag.js) - Google Analytics