Java - Calendar类:秒设置为00 但获取却为01的问题

概念

  • java.util.Calendar类表示一个“日历类”,可以进行日期运算
  • 它是一个抽象类,不能创建对象,我们可以使用它的子类:java.util.GregorianCalendar类

有两种方式可以获取GregorianCalendar对象:

  1. 直接创建GregorianCalendar对象;
  2. 通过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();

获取结束时间,将获取到的时间向上取整分结束 - 需求完成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值