工作中需要用到 比较时间 这个问题比较老套,看似简单,不过在具体实现的时候还是遇到了不少麻烦,写下来以作记录吧。
首先我的环境是jquery datepicker + spring+ mybatis + mysql,在这篇文章中所诉的内容应该与具体的sql产品无关。
- jquery datepicker
我们知道,前端一般需要选择一个时间(或者时间段),jquery的datepicker插件很方便。对于选择时间段,本身已能够实现对于非法时间的禁止选择。
jquery等插件必然可以格式化时间,最终向服务端发送一个字符串。比如:2011-03-09
2011/03/09。
- 服务端
服务端如果直接接收这个字符串来转化为某种日期类型这个比较简单。在我的实现中,会通过额外的辅助字段,通过反射自动转换为对应的类。
其中propertyType是需要转换为的类型,value为String类型的“原始值”,通过apache的反射包转换为对应的Object。propertyValue = ConvertUtils.convert(value, propertyType);
- 日期类的选择
通常可以选择java.util.Date java.sql.Date java.sql.Timestamp。
这里强烈推荐使用Timestamp
1、因为Timestamp可以直接映射数据库德timestamp类型,他是slq.Date的子类。
2、在mybatis中使用timestamp的话,直接打印输出,mysql可以自动支持。 - 问题
- 对于Timestamp,jquery的插件只能精确到日,而如果只提供年月日,apache的转换包会跑出如下异常:
所以,需要在前段写一些JS,在年月日后添加上时分秒及毫秒信息,注意:9个f也必须填。比如:String must be in JDBC format [yyyy-MM-dd HH:mm:ss.fffffffff] to create a java.sql.Timestamp
2011-03-01 00:00:00.000000000
- 在写mybatis文件的时候,《=号需要用CDATA包围。
<if test="beginTime != null"> <![CDATA[ AND beginTime >= "${beginTime}" ]]> </if> <if test="endTime != null"> <![CDATA[ AND endTime <= "${endTime}" ]]> </if>