您当前的位置: 首页 >  hibernate

liaowenxiong

暂无认证

  • 0浏览

    0关注

    1171博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Struts2+Hibernate项目中的时间和日期问题

liaowenxiong 发布时间:2022-07-06 17:51:01 ,浏览量:0

文章目录
  • 数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间
  • 日期控件
  • 日期时间数据展示问题
  • 日期时间数据存储问题
    • 场景一
    • 场景二
    • 场景三
    • 场景四

数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间

数据表列的类型是 datetime,数据格式如下:

2022-07-13 02:07:05

hibernate 的映射类型 date 或者 timestamp,如下:


	



	

实体类属性的类型是 date 或者 timestamp,如下:

private Timestamp startDate;// 或 java.util.Date
private Timestamp endDate;

前端日期控件的类型是 date,如下:


后端返回给前端的数据格式是 json,如下:

{"project":{"code":"pm0001","endDate":"2021-12-08T00:00:00","id":34,"name":"pm0001","startDate":"2021-12-08T00:00:00"}}

其实就是将 Action 对象的属性值转换成 json 串 返回给前端。

其中的日期时间格式如下:

2021-12-08T00:00:00

就这样的日期时间格式,前端的 date 控件是无法将其展示出来的,但是你把前端日期控件改成 datetime-local,是可以正常展示的。但是如果你非要使用 date 日期控件展示呢?那么就可以在实体类的有关日期时间属性的 getter 方法上加上注解 @JSON(format = "yyyy-MM-dd"),这样传送给前端日期格式就会变成 2021-12-08,date 控件才能将其展示出来。

注:在项目 struts2-hibernate-pms 的恢复项目信息功能中有遇到这个问题

日期控件
 

2021-12-08T00:00:00,2021-12-08 00:00:00 这种格式的日期时间,date 控件无法将其显示出来。

2021-12-08T00:00:00 这种格式的日期时间,datetime-local 控件无法将其展示出来。

2021-12-08 这种格式的日期数据,datetime-local 控件无法将其展示出来。

datetime-local 控件传送给服务端的日期时间格式为:2022-08-27T10:41:00

日期时间数据展示问题

实体类属性的数据类型:Timestamp 或者 java.util.Date 数据表对应列的数据类型:datatime hibernate的映射类型:java.util.Date 或者 timestamp 在封装成实体类对象时,日期时间的格式是正常的:2021-12-08 00:00:00,所以可以直接将其赋值给前端的 datetime-local 控件展示出来。

如果实体类属性的数据类型是 Timestamp,把 hibernate 的映射类型改成 date,则在封装数据时会报错。如果实体类属性的数据类型是 java.util.Date,把 hibernate 的映射类型改成 date,不会报错,会得到日期 2021-12-08。

日期时间数据存储问题 场景一

实体类属性的数据类型:java.util.Date 数据表对应列的数据类型:datatime hibernate的映射类型:java.util.Date 或者 timestamp 前端日期时间控件类型是:datetime-local,你输入的是 2021-12-08 02:15:35 这种格式的日期时间,实际传送给服务端的格式是这样的:2022-08-18T11:04:35

struts2 的注入参数数据的拦截器会构造一个实体类对象,获取所有的参数数据,这些参数数据都是字符串类型的。例如获取字符串 2022-08-18T11:04,会将这个字符串转换成 java.util.Date 对象,再调用实体类对象对应的 setter 方法将上述对象存储到实体类对象中,所有的参数数据存储到实体类对象后,再调用 Action 对象对应的 setter 方法将实体类对象存储到 Action 对象中,这就是完成参数数据的注入,最终是注入到 Action 对象对应的属性中(严格讲应该是 Action 对象的属性对应的成员变量中)。

最终将 2021-12-08T02:15:35 转换成 Date 对象,这个对象的输出的结果如下:

Thu Aug 04 00:00:00 CST 2022

虽然可以成功转换成 Date 对象,但是时间被阉割了。

怎么办?

写转换器将字符串 2021-12-08T02:15:35 转换成 Date 对象。

第一步写转换器类,我这里写一个将字符串转换成Date对象或者Timestamp对象的转换器:

package priv.lwx.datetime.converter;

import org.apache.struts2.util.StrutsTypeConverter;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * 将字符串的日期时间转换成Date对象或者Timestamp对象
 *
 * @author liaowenxiong
 * @date 2022/8/13 21:06
 */

public class Converter extends StrutsTypeConverter {
  DateFormat[] df = {new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),
          new SimpleDateFormat("yyyyMMdd"),
          new SimpleDateFormat("yyyy年MM月dd日")};

  /**
   * @param context 当前上下文环境
   * @param values  jsp表单提交的字符串参数
   * @param toClass 要转换为的目标类型,这个在配置文件xwork-conversion.properties指定中
   */
  @Override
  public Object convertFromString(Map context, String[] values, Class toClass) {
    // values里面只有一个元素,就是请求参数的值
    System.out.println(values[0]);
    // 判断字符串数组的内容不能为空
    if (values == null || values.length == 0) {
      return null;
    }
    // 转换失败继续下一个格式的转换; 转换成功就直接返回
    for (int i = 0; i             
关注
打赏
1661566967
查看更多评论
0.0464s