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


    问题

    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

  • 相关阅读:
    记一次阿里云硬盘在线扩容
    大文件传输技巧-----split切割
    数据库迁移-------通过ibdata1文件和数据库文件迁移
    小技巧---------------vim 使用技巧 set paste 解决粘贴乱序问题
    webfrom 做项目的注意事项
    webform 复合控件
    wenfrom的简单控件和repeater控件
    分页功能 与 分类查询功能合并
    内置对象2
    简单的人员管理系统
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/date2string.html
Copyright © 2020-2023  润新知