问题
ConversionException: Could not convert '2017-8-28 0:00:00' to java.util.Date
at com.vaadin.data.util.converter.StringToDateConverter.convertToModel(StringToDateConverter.java:78)
开发中遇到这样的一个问题,日期转换出错。
使用的是cuba框架,数据库日期并非保存在一个单独的Date字段中,而是保存在一个json串中。
刚开始保存格式为 "{code_act_Date2}":"2017-8-29 0:00:00" ,在本地是没有问题的,但是在Linux服务器上报了以上错误
让使用Ubuntu系统进行开发的同事进行测试,也不会报错,排除了系统原因。
解决思路
这个框架的日期控件转换比较奇葩,不是使用日期格式化转换的,而是直接new Date()转换。
后来把保存格式修改为 "{code_act_Date2}":"Thu Sep 21 00:00:00 CST 2017",在服务器上也不会报错了。
如下测试:
String str = "2017-7-31 0:00:00"; Date date = new Date(str); System.out.println(date); /* 输出:Exception in thread "main" java.lang.IllegalArgumentException at java.util.Date.parse(Date.java:617) at java.util.Date.<init>(Date.java:274) at cn.com.dataocean.cip.web.Test4.main(Test4.java:28) */ String str = "Thu Sep 21 00:00:00 CST 2017"; Date date = new Date(str); System.out.println(date); /* 输出:Thu Sep 21 14:00:00 CST 2017 */
实现方式
//在Cuba中FieldGroup 绑定页面Date控件方法 PropertysetItem item = new PropertysetItem(); item.addItemProperty("{code_act_Date2}",new DateField()); FieldGroup fieldGroup = new FieldGroup(item); DateField webDateField= new DateField(); webDateField.setDateFormat("yyyy年MM月dd日"); fieldGroup.bind(webDateField, "{code_act_Date2}"); //从数据库中取出值转换到页面的时候转换的时候,需要类似一下代码 if (propertysetItem.getItemProperty(key).getType() == Date.class) { Date date = new Date((String) mapValues.get(key)); propertysetItem.getItemProperty(key).setValue(date); } //如果需要手动从WebDateField 转换成之前的那种日期格式如下: return webDateField.getDateField().getValue().toString(); //从日期格式转换为日期就是之前的那种 Date date = new Date(str);
相关链接:http://www.cnblogs.com/acm-bingzi/p/cubaFieldGroup.html
原问题再分析
服务器上报错的那段代码打上断点,在本地进行断点尝试,本地并没有报错,如下:
在服务器上报错的原因,可能是因为locale这些值不是zh之类的。不过纠结于这里,不如按照上面的方法修改来的彻底。
日期类型存储成字符串类型的格式最好是"Thu Sep 21 00:00:00 CST 2017",因为可以直接使用new Date(str); 的方式进行转换,而不需要格式化。
发现直接使用new Date()这个方法,会导致有些日期显示的时候,增加一天。这是由于new Date()这个方法本身的计算错误导致的,所以这里应该使用日期格式化来解决,而不是之前的那种方式