bug修复之时间日期的比较问题

我爱海鲸 2023-03-07 22:02:25 暂无标签

简介Date、日期、时分秒、时间大小的比较

日期参考函数,请参考:java日期转换函数,debug问题

2023-03-07今天在修复一个bug的时候遇到一个很有意思的东西

需求是这样的,我们有一张预售单需要结案,在预售单上有一个销售时间,但是我们在付款结案的时候,销售时间不能小于当前的时间。(注意不需要校验时分秒)

我们来看一下我之前是怎么写的

  public static Date getCurrentDateEnd(Date currentDate) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(currentDate);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        return calendar.getTime();
    }


    public static void main(String[] args) {
        Date date1 = getCurrentDateEnd(new Date());
        Date date2 = getCurrentDateEnd(new Date());
        int i = date1.compareTo(date2);
        System.out.println(i);
    }

这样写,我每次测试返回的值都为-1,然后我就一直在想,为什么会为-1,从代码逻辑上来讲,每次获取当前的日期之后,就会把当前的日期转化为当天的最后一秒,那么这两个日期对比,那么应该是相等的?

那么原因是什么呢?然后我用chatgpt看了一下,那么看一下它的解析:

从它的解析看,我们最大的一个问题就是忽略了毫秒的时间,因为在获取第二个时间的时候,毫秒数也会发生变化,最后会导致两个日期的对比不相等。

然后它给出的解决方案如下:

Date date1 = getCurrentDateEnd(new Date());
Date date2 = getCurrentDateEnd(new Date());

// 将日期对象的毫秒部分设为零
date1 = new Date(date1.getTime() / 1000 * 1000);
date2 = new Date(date2.getTime() / 1000 * 1000);

// 比较两个日期对象
int i = date1.compareTo(date2);
System.out.println(i);

经测试,我们发现这样返回的结果为0,也是就这两个对象是相等的。

那么今天我是怎么解决的呢?代码如下:

    public static void main(String[] args) {
        // 当前日期的字符串
        String currentDateStr = DateUtil.getDateDefaultFormat(getCurrentDateEnd());
        // 销售日期的字符串 这个时间是通过前端传过来的
        String saleDateStr = DateUtil.getDateDefaultFormat(getCurrentDateEnd());
        Date date1 = DateUtil.parse(currentDateStr);
        Date date2 = DateUtil.parse(saleDateStr);
        System.out.println(date1.compareTo(date2));
    }

我的思路就是将两个时间的Date对象转化为日期的字符串,然后再将字符串转化为对象,然后我们在判断这两个对象大小,这个时候这两个对象就是相等的了。

上面的那些日期参考函数,请参考:java日期转换函数,debug问题

 

你好:我的2025