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

摘要:
使用cuba框架。数据库日期不保存在单独的date字段中,而是保存在json字符串中。最初,保存格式为“{code_act_Date2}”:。将日期类型存储为字符串类型的最佳格式是“ThuSep2100:00:00CST2017”,因为您可以直接使用newDate;不带格式。

问题

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

原问题再分析

  服务器上报错的那段代码打上断点,在本地进行断点尝试,本地并没有报错,如下:

日期类型存储成字符串类型的格式问题第1张
  在服务器上报错的原因,可能是因为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

免责声明:文章转载自《日期类型存储成字符串类型的格式问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Django微信小程序后台开发教程InnoDB和MyISAM是否支持hash索引下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java日期格式大全 format SimpleDateFormat(转)

java日期格式大全 format SimpleDateFormat /*** 字符串转换为java.util.Date<br>* 支持格式为 yyyy.MM.dd G 'at' hh:mm:ss z 如 '2002-1-1 AD at 22:10:59 PSD'<br>* yy/MM/dd HH:mm:ss 如 '2002/1/1...

Oracle中的日期和字符串互相转换

转载出处:http://blog.sina.com.cn/s/blog_44a005380100k6rv.html TO_DATE格式(以时间:2007-11-02   13:45:25为例)            Year:              yy two digits 两位年                显示值:07         yyy...

oracle中to_date详细用法示例(oracle日期格式转换)

1. 日期和字符转换函数用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年selec...

PHP date("Y-m-d H:i:s");获取当前时间 差8小时解决办法

原因: 从php5.1.0开始,php.ini里加了date.timezone这个选项,并且默认情况下是关闭的也就是显示的时间(无论用什么php命令)都是格林威治标准时间和我们的时间(北京时间)差了正好8个小时。 关于timezone 大陆内地可用的值是:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi ,PRC(依次为...

django后台admin的配置

DJANGO ADMIN 一些有用的设置Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据。后台管理可以在各个app的admin.py文件中进行控制。以下是我最近摸索总结出比较实用的配置。若你有什么比较好的配置,欢迎补充。 一、基本设置 1、应用注册 若要把app应用显示在后台管理中,需要在admin.py中注册。这...

python 获取系统时间,新建时间目录

import datetime import os theTime = datetime.datetime.now() print(theTime) theTime = str(theTime) date_split = theTime.strip().split(' ') date_today = date_split[0].replace('-', '...