概念
- java.util.Calendar类表示一个“日历类”,可以进行日期运算
- 它是一个抽象类,不能创建对象,我们可以使用它的子类:java.util.GregorianCalendar类
有两种方式可以获取GregorianCalendar对象:
- 直接创建GregorianCalendar对象;
- 通过Calendar的静态方法getInstance()方法获取Calendar对象
想要了解Calendar类的使用可以去参考有关该类的资料(这里就不过多重复介绍了)
今天我们要讲的一个问题:在使用Calendar类时,将秒设置为00后,获取到的时间显示却变成了随机状态出现00、01两种情况。如图所示:
从图中我们可以发现:bid_time是开始时间,end_bid_time是我要获去的时间也就是结束时间,我的需求是将获得到的时间向上取整分结束,但是在我自测自己逻辑代码的时候发现,秒钟部分出现了如标题所述的情况:一部分为00,一部分则为01,并且该情况不是有序的而是随机的。这显然不符合需求的逻辑,给大家看看一开始的逻辑代码:
代码所示
//上拍开始投标
auctionRoomDO.setBidTime(date);
auctionRoomDO.setRoomStatus(AuctionRoomStatusEnum.IN_BID.getCode());
Date endBidTime = new Date(auctionRoomDO.getBidTime().getTime() + time);
//结束时间取整分结束
Calendar calendar = new GregorianCalendar();
calendar.setTime(endBidTime);
calendar.add(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
endBidTime = calendar.getTime();
于是我去查阅了有关Calendar类的资料中发现:首先当我们使用GregorianCalendar
类创建了一个新的Calendar
实例。然后,使用calendar.setTime(endBidTime)
将endBidTime
的时间设置到日历实例中。接下来,calendar.add(Calendar.MINUTE, 1)
向日历实例添加了1分钟,这会增加分钟和秒数(目前这个情况我是判定为随机的)。
最后,calendar.set(Calendar.SECOND, 0)
将日历实例的秒数字段设置为0。然而,由于前一行代码添加了1分钟到日历中,导致秒数字段已经变成了01,从而使得结束竞标时间的秒数为01而不是00。
得知原因后我将代码逻辑的顺序进行上下交换,但是发现这仍然和原问题没有差别,即使先将秒数变为0,但是再下一步添加一分钟的时候还是会随机地增加秒数,因此获得的时间仍然是随机无序的00、01的状态。
代码所示
//上拍开始投标
auctionRoomDO.setBidTime(date);
auctionRoomDO.setRoomStatus(AuctionRoomStatusEnum.IN_BID.getCode());
Date endBidTime = new Date(auctionRoomDO.getBidTime().getTime() + time);
//结束时间取整分结束
Calendar calendar = new GregorianCalendar();
calendar.setTime(endBidTime);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.MINUTE, 1);
endBidTime = calendar.getTime();
最后我们已经明白了Calendar类的这么一个特性,因此我们可以直接在分钟增加之后再添加一个将秒数变为0的逻辑,这样就能确保逻辑代码的一个健壮性。
代码所示
//上拍开始投标
auctionRoomDO.setBidTime(date);
auctionRoomDO.setRoomStatus(AuctionRoomStatusEnum.IN_BID.getCode());
Date endBidTime = new Date(auctionRoomDO.getBidTime().getTime() + time);
//结束时间取整分结束
Calendar calendar = new GregorianCalendar();
calendar.setTime(endBidTime);
calendar.set(Calendar.SECOND, 0);
calendar.add(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
endBidTime = calendar.getTime();
获取结束时间,将获取到的时间向上取整分结束 - 需求完成!