Calendar计算出一个月后1天的23点59分59秒,但是减1毫秒后,存入数据库的数据没有减的问题。

昨天遇到的一个问题,要根据当前时间计算出一个月后的某一天,推后一天的23点59分59秒,在测试类进行测试的时候没有任何问题,代码如下:

 

    public Date getTheLastTime(Date date){
        Calendar calendar = Calendar. getInstance();
        calendar.setTime(date);
        calendar.set(Calendar. HOUR_OF_DAY, 0);
        calendar.set(Calendar. MINUTE, 0);
        calendar.set(Calendar. SECOND, 0);
        calendar.set(Calendar. MILLISECOND, -1);
        calendar.add(Calendar. DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    @Test
    public void monthLaterTest(){
        long nowTime = System.currentTimeMillis();
        long day2Sss = 30L * 24 * 60 * 60 *1000;
        long newTime = nowTime + day2Sss;
        System.out.println(getTheLastTime(time2Date(newTime)));
    }

举例来说今天是 2018-6-29 11:41:52,我需要生成的时间就是 2018-7-30 23:59:59,测试类结果如下:

Mon Jul 30 23:59:59 CST 2018

没有任何问题,但是布到项目中执行,存入数据库的结果却成了 2018-7-31 0:00:00。

这是因为MySQL默认存储datetime是精确到秒的,所以减掉一个毫秒之后存入MySQL,MySQL并不care。

于是将减1毫秒改成减1秒,就好了:

public Date getTheLastTime(Date date){
        Calendar calendar = Calendar. getInstance();
        calendar.setTime(date);
        calendar.set(Calendar. HOUR_OF_DAY, 0);
        calendar.set(Calendar. MINUTE, 0);
        calendar.set(Calendar. SECOND, -1);
        calendar.set(Calendar. MILLISECOND, 0);
        calendar.add(Calendar. DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

如果想让MySQL精确到毫秒,可以将数据库中的时间字段类型长度设置为3。


喜欢本文的朋友不要忘记点一个免费的赞哦,你的赞将是我最大的动力。

您可以使用Java中的Calendar类来获取本月第一0时间和本月最后一235959时间,具体代码如下: ```java import java.util.Calendar; public class DateTimeUtils { public static void main(String[] args) { // 获取本月第一0时间 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为本月第一 calendar.set(Calendar.HOUR_OF_DAY, 0); // 设置为0 calendar.set(Calendar.MINUTE, 0); // 设置为0 calendar.set(Calendar.SECOND, 0); // 设置为0 calendar.set(Calendar.MILLISECOND, 0); // 设置为0毫秒 long firstDayOfMonth = calendar.getTimeInMillis(); System.out.println("本月第一0时间:" + firstDayOfMonth); // 获取本月最后一235959时间 calendar.add(Calendar.MONTH, 1); // 设置为下个月第一 calendar.add(Calendar.DAY_OF_MONTH, -1); // 设置为本月最后一 calendar.set(Calendar.HOUR_OF_DAY, 23); // 设置为23 calendar.set(Calendar.MINUTE, 59); // 设置为59 calendar.set(Calendar.SECOND, 59); // 设置为59 calendar.set(Calendar.MILLISECOND, 999); // 设置为999毫秒 long lastDayOfMonth = calendar.getTimeInMillis(); System.out.println("本月最后一235959时间:" + lastDayOfMonth); } } ``` 运行结果如下: ``` 本月第一0时间:1633075200000 本月最后一235959时间:1635753599999 ``` 其中,`getTimeInMillis()`方法可以获取当前时间毫秒数,即时间戳,单位为毫秒
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Counter-Strike大牛

创作不易,感谢鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值