• 我爱java系列---【次日凌晨00:00:00生效】


    开发中有时候要用到生效时间,我遇到一个问题,后台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://www.jb51.net/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>
    愿你走出半生,归来仍是少年!
  • 相关阅读:
    矩阵树定理(Kirchhoff || Laplace)初探——Part 1(无向图计数)
    AC自动机——看似KMP在跑,其实fail在跳
    逆序数模板
    牛客暑期五几何题
    priority_queue()大根堆和小根堆(二叉堆)
    STL中去重函数unique
    简单判断long long 以内的回文数
    素数判断和素数筛(简单方便)
    记忆化递归
    map详细的复习
  • 原文地址:https://www.cnblogs.com/hujunwei/p/12029247.html
Copyright © 2020-2023  润新知