现象描述:
打算将由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字符串直接转换为Java对象,特别是涉及到多层List集合的情况。在本例中,我们将使用`net.sf.json.JSONObject`类来实现这一功能。 首先,确保你的项目中已经引入了必要的库。在使用`...
标题中的“使用json-lib将java对象转换成json字符串”指的是在Java编程中,利用json-lib这个库来将Java对象转化为JSON格式的字符串。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端...
在这个`xmlStrToBean`方法中,我们首先使用`DocumentHelper.parseText()`将XML字符串解析为`Document`对象,然后获取根元素。接着,我们遍历根元素的所有子元素,将每个元素的名称作为Bean的属性名,元素的文本作为...
在上述示例中,`ObjectMapper`将JSON字符串转换为一个Map对象,然后BeanUtils的`copyProperties`方法会遍历Map,将键值对分别赋值给User对象的对应属性。 相反,如果你需要将JavaBean转换为JSON字符串,你也可以...
1. **解析JSON字符串**:首先,我们需要使用JSON库解析JSON字符串,将其转化为JSON对象或JSON数组。例如,`json-lib`库提供了`JsonUtil`类,可以将JSON字符串转换为Java集合对象,如List或Map。 2. **转换数据结构*...
例如,将字符串转换为整型或浮点型,或者将日期字符串转换为Date对象。这对于数据绑定和对象模型之间的数据传递非常有用。 在使用BeanUtils时,主要涉及以下几个关键知识点: 1. **属性设置和获取**:BeanUtils...
2. `BeanUtils.getProperty()`: 获取JavaBean对象的属性值,只需属性名,返回结果自动转换为字符串。 3. `PropertyUtils.setProperty()`: 类似于`BeanUtils.setProperty()`,但返回值是属性对应的原始类型,而不是...
例如,如果属性期望的是一个整型值,而传递的是一个字符串,它会尝试将字符串转换为整型。然而,如果转换失败,它会抛出异常,因此在使用时需要注意处理这类异常。 4. **空值处理** 当属性值为null时,BeanUtils....
在Java编程中,将各种对象转换为JSON(JavaScript Object Notation)字符串是一项常见的任务,这有助于数据交换和序列化。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。在给定的...
JSON Lib提供了将Java对象转化为JSON字符串以及将JSON字符串反序列化为Java对象的能力。在Java中解析JSON字符串,这个库是最核心的依赖。 5. **ezmorph-1.0.6.jar**:EZMorph库提供了一种简单的方式来转换Java对象...
BeanUtils在处理null值时有特殊的逻辑,比如`getProperty()`方法会返回一个空字符串,而不是抛出NullPointerException。这种设计使得在处理可能为空的属性时更加安全。 5. **国际化与本地化(Internationalization...
2. 对于基本数据类型(如`String`、`Integer`、`Float`等)以及它们的包装类,将对象转换为字符串并用双引号包裹。 3. 对于`Object[]`数组,调用`array2json`方法进行处理。 4. 对于`List`,调用`list2json`方法。 5...
- **属性设置和获取**:BeanUtils提供了`getProperty()`和`setProperty()`方法,可以方便地设置或获取对象的属性值,即使属性名是驼峰式命名,也能自动转换为下划线形式的setter/getter方法。 - **类型转换**:...
- **转换器(Converters)**:BeanUtils内建了一套转换机制,可以自动将一种数据类型转换为另一种,如将字符串转换为整数或日期等。 - **复制属性**:`copyProperties()`方法可以将一个JavaBean对象的属性值复制到...
`PropertyUtils.getProperty()`和`PropertyUtils.setProperty()`方法允许你通过字符串形式的属性名来操作对象的属性,这样就不需要事先知道属性的确切名称。这在处理动态属性或者处理来自数据库或其他数据源的未知...
例如,如果我们有一个前端传来的JSON字符串,可以先将其转化为Java对象,然后利用`BeanUtils.copyProperties()`将这个对象的属性赋值给对应的JavaBean实例。 ```java String jsonString = "{'name':'张三', 'age':...
首先,BeanUtils的核心功能在于属性操作,它提供了`copyProperties()`方法,允许我们快速地将一个Java Bean对象的所有属性值复制到另一个Bean对象中。这在处理表单数据和模型对象映射时非常有用。例如,我们可以用它...
当JavaBean对象中包含List或Map等集合属性时,可以使用`populate()`方法将Map对象中的键值对填充到JavaBean对象中,实现了将复杂数据结构转换为JavaBean的过程。 在使用BeanUtils时,需要注意的是,由于它依赖于...