开发中有时候要用到生效时间,我遇到一个问题,后台effective是datetime类型的,实体类中是date类型的,直接new date()(当前时间是:2019-12-12 14:58:00 )格式化之后存到数据库里,工具类调用之后时间老是和本地时间不一致,打断点,断点显示2019-12-13 00:00:00 ,而数据库存的却是:2019-12-12 16:00:00
上面图中红色圈的是我解决问题之后的正确结果。
解决方案一:
日期工具类:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateUtils { /** * 获取次日0点时间 * @param date * @return java.util.Date */ public static String toSecDayStartHour(Date date) throws ParseException { Calendar cal=Calendar.getInstance(); cal.add(Calendar.DATE,1);//这里改为1 Date time=cal.getTime(); //2019-12-12 11:29:26 String s = new SimpleDateFormat("yyyy-MM-dd 00:00:00").format(time); return s; } }
我把数据库的effective生效时间类型改成了字符串varchar,实体类中也改成了string类型,这样就不会出现那种情况了。
解决方案二:
# 获取今日凌晨时间 UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE)) # 获取昨日凌晨时间 UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) - INTERVAL 1 DAY) # 获取明日凌晨时间 UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) + INTERVAL 1 DAY) # 获取的是时间戳 # 时间戳转换成datetime, datetime也就是我们说的日期格式 年-月-日 时-分-秒 FROM_UNIXTIME(); # datetime转时间戳 UNIX_TIMESTAMP(); # 测试 SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE))) 今日; SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) - INTERVAL 1 DAY)) 昨日; SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) + INTERVAL 1 DAY)) 明日; # 结果: 2019-10-06 00:00:00 // 今日 2019-10-05 00:00:00 // 昨日 2019-10-07 00:00:00 // 明日 # 可看出 + INTERVAL 1 DAY 可自己随意修改 # DATE_FORMAT(datetime ,format)用法,转换日期格式 DATE_FORMAT('2019-10-07 00:00:00', '%Y-%c-%d'); # 结果: 2019-10-07 // DATE_FORMAT之后的结果 # 常用的: # '%Y-%c-%d %H:%i:%S' # 年-月-日 时:分:秒 # '%Y-%c-%d' # 年-月-日 # '%H:%i:%S' # 时:分:秒 # 自己随意取舍 # 下面7点来自 : https:///article/132425.htm 1、当前日期 select DATE_SUB(curdate(), INTERVAL 0 DAY) ; 2、明天日期 select DATE_SUB(curdate(), INTERVAL -1 DAY) ; 3、昨天日期 select DATE_SUB(curdate(), INTERVAL 1 DAY) ; 4、前一个小时时间 select date_sub(now(), interval 1 hour); 5、后一个小时时间 select date_sub(now(), interval -1 hour); 6、前30分钟时间 select date_add(now(), interval -30 minute) 7、后30分钟时间 select date_add(now(), interval 30 minute)
修改sql语句:这里我用的是xml,标记颜色部分重点。
<insert id="insertSelective" parameterType="com.demo.PriceBatch"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into price_batch <trim prefix="(" suffix=")" suffixOverrides=","> <if test="channelId != null"> CHANNEL_ID, </if> <if test="provinceIdList != null"> PROVINCE_ID_LIST, </if> <if test="priceList != null"> PRICE_LIST, </if> <if test="1 == 1"> EFFECTIVE_TIME, </if> <if test="status != null"> STATUS, </if> <if test="createTime != null"> CREATE_TIME, </if> <if test="createBy != null"> CREATE_BY, </if> <if test="updateTime != null"> UPDATE_TIME, </if> <if test="updateBy != null"> UPDATE_BY, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="channelId != null"> #{channelId,jdbcType=INTEGER}, </if> <if test="provinceIdList != null"> #{provinceIdList,jdbcType=VARCHAR}, </if> <if test="priceList != null"> #{priceList,jdbcType=VARCHAR}, </if> <if test="1 == 1"> (SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(CAST(SYSDATE()AS DATE) + INTERVAL 1 DAY))), </if> <if test="status != null"> #{status,jdbcType=TINYINT}, </if> <if test="createTime != null"> #{createTime,jdbcType=TIMESTAMP}, </if> <if test="createBy != null"> #{createBy,jdbcType=VARCHAR}, </if> <if test="updateTime != null"> #{updateTime,jdbcType=TIMESTAMP}, </if> <if test="updateBy != null"> #{updateBy,jdbcType=VARCHAR}, </if> </trim> </insert>