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

文章目录

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

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

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

2022-07-13 02:07:05

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

<property generated="never" lazy="false" name="startDate" type="timestamp"><column name="start_date"/>
</property>
<!--或者-->
<property generated="never" lazy="false" name="startDate" type="java.util.Date"><column name="start_date"/>
</property>

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

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

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

<input id="startDate" type="date" name="project.startDate" value="${project.startDate}"/>

后端返回给前端的数据格式是 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 的恢复项目信息功能中有遇到这个问题

日期控件

 <input id="endDate" type="datetime-local" name="project.endDate" value="${project.endDate}"/>

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指定中*/@Overridepublic 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 < df.length; i++) {try {String datetime = values[0].replaceAll("T", " ") + ":00";Date date = df[i].parse(datetime);if (toClass == Date.class) {// 判断要转换的目标类型是不是Datereturn date;} else if (toClass == Timestamp.class) {// 判断要转换的目标类型是不是Timestamp// System.out.println(date);return new Timestamp(date.getTime());}} catch (ParseException e) {continue;}}return null;}@Overridepublic String convertToString(Map context, Object o) {if (o instanceof Date) {// 判断o是不是Date的实例Date date = (Date) o;return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);}if (o instanceof Timestamp) {// 判断o是不是Timestamp的实例Timestamp timestamp = (Timestamp) o;//输出的格式是yyyy-MM-ddreturn new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp);}return null;}}

第二步写配置文件 xwork-conversion.properties,内容为:

java.util.Date=priv.lwx.pms.converter.Converter

等号左边指定你要转换的目标类型,在调用转换器方法时,会根据这个类型获取其 Class 对象,传入转换器方法中。等号右边就是转换器类的全限定名。

上面的配置文件是全局性的,放置在 resources 目录下,如果是针对某个类中的某些属性进行转换,则将配置文件放置在该类所在的目录下。配置文件名称规则:类名-conversion.properties,配置文件内容规则:属性名称=类型转换器类的全限定名

场景二

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

[‘2022-08-27T10:41’, ] 无法转换成 Timestamp 对象或者 Date 对象,报错了。

Unexpected Exception caught setting 'project.endDate' on 'class priv.lwx.pms.action.ProjectCreateAction: Error setting expression 'project.endDate' with value ['2022-08-27T10:41', ]

怎么办?
写转换器,将 2022-08-27T10:41 转换成 Timestamp 对象。转换器类就用上述的,配置文件中的内容如下:

java.sql.Timestamp=priv.lwx.pms.converter.Converter

场景三

实体类属性的数据类型:java.util.Date
前端日期时间控件类型是:datetime-local,你输入的是 2021-12-08 02:15:35 这种格式的日期时间

前端对日期时间进行处理,将 2021-12-08T02:15:35 处理成 2021-12-08 02:15:35 再传送给服务端。如果 Action 对应的属性的类型是 Date,那么 struts2 注入数据的拦截器会将这个字符串转换成 Date 对象,有趣的是,在转换的时候 2021-12-08 02:15:35 中的时间部分还是会被阉割掉。你把 Date 打印到控制台看到的结果如下:

参数startDate的值:2022-08-12 01:29:00
startDate:Fri Aug 12 00:00:00 CST 2022

怎么办?
写转换器将 2021-12-08T02:15:35 日期转换成 Date 对象,那么前端就不要处理了,没用!

场景四

实体类属性的数据类型:Timestamp
前端日期时间控件类型是:datetime-local,你输入的是 2021-12-08 02:15:35 这种格式的日期时间

前端对日期时间进行处理,将 2021-12-08T02:15:35 处理成 2021-12-08 02:15:35 再传送给服务端。如果 Action 对应的属性的类型是 Timestamp,那么 struts2 注入数据的拦截器会将这个字符串转换成 Timestamp 对象,结果报错了:

Unexpected Exception caught setting 'startDate' on 'class priv.lwx.datetime.action.CreateProjectAction: Error setting expression 'startDate' with value ['2022-08-15 02:35:00', '2022-08-15T02:35', ]

怎么办?

写转换器,实体类属性的类型是 Timestamp,而服务端收到的日期时间的数据类型是字符串,那么就写一个将字符串转换成 Timestamp的转换器

第一步写转换器类,我这里写一个将字符串转换成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指定中*/@Overridepublic 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 < df.length; i++) {try {String datetime = values[0].replaceAll("T", " ") + ":00";Date date = df[i].parse(datetime);if (toClass == Date.class) {// 判断要转换的目标类型是不是Datereturn date;} else if (toClass == Timestamp.class) {// 判断要转换的目标类型是不是Timestamp// System.out.println(date);return new Timestamp(date.getTime());}} catch (ParseException e) {continue;}}return null;}@Overridepublic String convertToString(Map context, Object o) {if (o instanceof Date) {// 判断o是不是Date的实例Date date = (Date) o;return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);}if (o instanceof Timestamp) {// 判断o是不是Timestamp的实例Timestamp timestamp = (Timestamp) o;//输出的格式是yyyy-MM-ddreturn new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp);}return null;}}

第二步写配置文件 xwork-conversion.properties,内容为:

java.sql.Timestamp=priv.lwx.datetime.converter.Converter

等号左边指定你要转换的目标类型,在调用转换器方法时,会根据这个类型获取其 Class 对象,传入转换器方法中。等号右边就是转换器类的全限定名。

上面的配置文件是全局性的,放置在 resources 目录下,如果是针对某个类中的某些属性进行转换,则将配置文件放置在该类所在的目录下。配置文件名称规则:类名-conversion.properties,配置文件内容规则:属性名称=类型转换器类的全限定名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中&#xff0c;大家都跟作文打过交道吧&#xff0c;写作文可以锻炼我们的独处习惯&#xff0c;让自己的心静下来&#xff0c;思考自己未来的方向。那要怎么写好作文呢&#xff1f;下面是小编为大家整理的把一个人的特点写具…

spring boot简介_Spring Boot简介

spring boot简介在本教程中&#xff0c;我们将看一下Spring Boot&#xff0c;看看它与Spring框架有何不同。 我们还将讨论Spring Boot提供的各种功能。 什么是Spring Boot&#xff1f; 在开发企业级应用程序时&#xff0c;Spring是一个功能强大的框架。 它为我们提供了诸如依赖…

C语言的运算符的优先级与结合性+ASCII表

【0】README 0.1&#xff09; 内容来源于 C程序设计语言&#xff0c; 旨在整理出C语言的运算符的优先级与结合性&#xff0c; 如下图所示&#xff08;哥子 记了大半年都没有记住&#xff0c;也是醉了&#xff0c;每次都要去翻&#xff09;&#xff1b; 0.2&#xff09; 再补充…

退货退款的售后,如何返还金币/有偿优惠券的问题

假设买家购买了3个商品&#xff0c;商品的销售价是10元&#xff0c;商品总金额是30元 买家应付金额是 30 元&#xff0c;买家使用5个金币抵扣5元&#xff0c;买家实付金额是 25 元。 后来买家退货 2 件&#xff0c;怎么退款和退币呢&#xff1f; 要将金币分摊到每个商品上&a…

python orm框架sqlalchemy_python ORM框架:SqlAlchemy

ORM,对象关系映射&#xff0c;即Object Relational Mapping的简称&#xff0c;通过ORM框架将编程语言中的对象模型与数据库的关系模型建立映射关系&#xff0c;这样做的目的&#xff1a;简化sql语言操作数据库的繁琐过程(原生sql的编写及拼接等)&#xff0c;转而直接使用对象模…

javadoc提取工具_使JavaDoc保持最新状态的工具

javadoc提取工具在许多项目中&#xff0c;文档不是最新的。 更改代码后&#xff0c;很容易忘记更改文档。 原因是可以理解的。 在代码中进行更改&#xff0c;然后进行调试&#xff0c;然后希望在测试中进行更改&#xff08;或者&#xff0c;如果您使用的是更多TDD&#xff0c;则…

栈应用(中缀表达式转后缀表达式并计算后缀表达式的值)

【0】README 0.1&#xff09; 本文旨在总结 中缀表达式转后缀表达式并计算后缀表达式的值 的步骤&#xff0c;并给出源代码实现&#xff1b; 0.2&#xff09; 本文中涉及到的源代码均为原创&#xff0c;是对中缀转后缀和计算后缀的简单实现&#xff0c;&#xff08;旨在理清它…

用户/账户/账号的理解

文章目录用户账户账号关系用户 用户概念的理解&#xff1a; 用户就是使用者&#xff0c;可以是个人用户&#xff0c;也可以是机构用户。 账户 账户概念的理解&#xff1a; 账户&#xff0c;所谓“账”&#xff0c;就是系统根据“账”来存储和管理数据&#xff0c;类似记账…

azure 部署java_jClarity:在Azure上升级到Java

azure 部署java在互联世界公共基础设施的新时代&#xff0c;最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此&#xff0c;许多公司将时间和资源投入到构建最先进的技术上&#xff0c;以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量&#xff0c;而且免费…

黑苹果sd卡认不出来_天生一对:新入苹果M1笔记本,DOCKCASE拓展坞弥补缺憾

2010年刚上大学那会&#xff0c;入手了人生第一台笔记本电脑&#xff0c;两边密密麻麻的各种接口&#xff0c;也没感觉到接口多少的价值&#xff1b;2016年年中入手了人生第一台苹果笔记本&#xff0c;第一次觉得电脑接口不够用&#xff1b;如今四年过去了电脑也到了更新换代的…

利用树的先序和后序遍历打印os中的目录树

【0】README0.1&#xff09;本代码均为原创&#xff0c;旨在将树的遍历应用一下下以加深印象而已&#xff1b;&#xff08;回答了学习树的遍历到底有什么用的问题&#xff1f;&#xff09;你对比下linux 中的文件树 和我的打印结果就明理了&#xff1b;0.2&#xff09;我们采用…

Hibernate常用API

文章目录删除指定的记录新增记录更新记录清空缓存将实体对象从缓存中清除将缓存中更新的数据同步到数据库把数据库中的数据刷到缓存中查询多个对象&#xff08;也就是查询多条记录&#xff09;查询指定ID的对象&#xff08;查询指定ID值的记录&#xff09;参考删除指定的记录 U…

solid设计原则_SOLID设计原则

solid设计原则介绍&#xff1a; Robert C. Martin定义了五项面向对象的设计原则&#xff1a; 小号英格尔-责任原则 笔封闭原则 大号 iskov的替换原则 我覆盖整个院落分离原则&#xff0c;并 d ependency倒置原则 这些一起被普遍称为SOLID原则。 在设计面向对象的系统时&a…

nosql简答什么是最终一致性_NoSql的三大基石:CAP理论BASE最终一致性

关系型数据库的局限NoSql出现在关系型数据库之后&#xff0c;主要是为了解决关系型数据库的短板&#xff0c;我们先来看看随着软件行业的发展&#xff0c;关系型数据库面临了哪些挑战&#xff1a;1、高并发一个最典型的就是电商网站&#xff0c;例如双11&#xff0c;几亿大军的…

二叉树的先中后序遍历

【0】README 0.1&#xff09;本文旨在理清二叉树的先中后序遍历&#xff0c; 以及如何建立二叉树等相关内容&#xff1b; 0.2&#xff09;本文涉及代码均为原创&#xff1b; 0.3&#xff09;本文中遍历后的打印结果&#xff0c;朋友您可以直接写出二叉树的节点构造出来&…

表达式树

【0】README 0.1&#xff09;本文旨在总结出表达式树的构建步骤&#xff0c; 其中还涉及到中缀转后缀表达式&#xff0c;以及如何计算 表达式树中的值&#xff1b; 0.2&#xff09;本文源代码均为原创&#xff1b; 0.3&#xff09; 其实&#xff0c; 实现一个简单的计算器&a…

Date/Timestamp/String/LocalDate/LocalDateTime

文章目录String 转成 DateDate 转成 StringString 转成 Timestamp获取系统当前的毫秒数获取系统当前的日期时间毫秒数转成 Timestamp毫秒数转成 DateTimestamp 转成 StringDate 转成 TimestampTimestamp 转成 Datejava.util.Date 转成 java.sql.Date将带T的日期时间转成正常的日…

python可以用来写什么工具_python写工具

谷歌开源 Python Fire&#xff1a;可自动生成命令行接口今天我们很高兴地宣布 Python Fire 开源。Python Fire 可从任何 Python 代码生成命令行接口(command line interfaces (CLIs))&#xff0c;简单地调用任意 Python 程序中的 Fire 函数以将那个程序自动地转化为 CLI。该库可…

java原始类型和引用类型_Java中的8种原始类型

java原始类型和引用类型几年前&#xff0c;当我开始编辑Java Basics系列时&#xff0c;我认为将一些非常详细的信息拉到自己的帖子中是很有意义的。 这样&#xff0c;初学者的内容就更容易消化了。 首先&#xff0c;我将介绍有关Java的8种原始类型的所有信息。 Java基本类型 正…

androidtabhost缓存_FragmentTabHost布局的使用及优化方式

欢迎Follow我的GitHub, 关注我的简书. 其余参考Android目录.TabHostAndroidFragmentTabHost作为Android4.0版本的控件, 已经被项目广泛使用, 5.0版本又推出TabLayoutViewPager显示多页. 我来讲解如何使用FragmentTabHost.本文源码的GitHub下载地址主要包括:(1) 自定义Tab的图片…