问题:
合同结束时间,应为当年的最后一天,为什么显示的是2027年
原因:老代码用的类型是Date,数据库用的类型是dateTime
java.util.Date 内部就是一个 long类型的变量,存的是 自1970-01-01 00:00:00 GMT 以来的毫秒数(可以见下图是以毫秒值的形式进行存储)
库里接收到毫秒值,四舍五入,大于500的会自动进位到2027年1月1日(如2026年23点59分59秒501或者999毫秒)
Date startTime = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(startTime); calendar.set(Calendar.MONTH, Calendar.DECEMBER); calendar.set(Calendar.DAY_OF_MONTH, 31); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); Date endTime = calendar.getTime();
解决方案:
显示指定精度后三位(支持毫秒),解决跨年问题
ALTER TABLE t_contract
MODIFY COLUMN end_time DATETIME(3) DEFAULT NULL COMMENT '合同终止日期';
原为:
解决后:
证明四舍五入:
类型是datetime的前提下
TABLE t_contract MODIFY COLUMN end_time DATETIME;,