日期类型存储成字符串类型的格式问题

问题

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()这个方法本身的计算错误导致的,所以这里应该使用日期格式化来解决,而不是之前的那种方式

参考:http://www.cnblogs.com/acm-bingzi/p/newDate.html

原文地址:https://www.cnblogs.com/acm-bingzi/p/date2string.html