我有两个LocalTime对象:
LocalTime time1 = LocalTime.of(8, 0, 0);
LocalTime time2 = LocalTime.of(15, 0, 0);
我想在这两个对象之间生成一个随机的LocalTime对象。
我已经尝试使用rand.nexInt()
Random rand = new Random();
int hours = rand.nextInt((time2.getHour() - time1.getHour()) + 1) + time1.getHour();
int minutes = rand.nextInt((time2.getMinute() - time1.getMinute()) + 1) + time1.getMinute();
int seconds = rand.nextInt((time2.getSecond() - time1.getSecond()) + 1) + time1.getSecond();
LocalTime random = LocalTime.of(hours,minutes,seconds);
但只会生成像9:00:00
这样的完整小时数。
答案 0 :(得分:3)
首先检查time2
之后是time1
。
然后,您可以将LocalTime
实例转换为代表一天中秒数的long
(LocalTime.toSecondOfDay()
方法做到这一点),然后在一天中的秒数之间选择一个随机数两个LocalTime
实例中的一个,并使用LocalTime.ofSecondOfDay()
创建随机LocalTime
。
LocalTime time1 = LocalTime.of(8, 0, 0);
LocalTime time2 = LocalTime.of(15, 0, 0);
int secondOfDayTime1 = time1.toSecondOfDay();
int secondOfDayTime2 = time2.toSecondOfDay();
Random random = new Random();
int randomSecondOfDay = secondOfDayTime1 + random.nextInt(secondOfDayTime2-secondOfDayTime1);
LocalTime randomLocalTime = LocalTime.ofSecondOfDay(randomSecondOfDay);
请注意,在Random.next(int bound)
中,bound
的值是排他的。因此,如果有关系,您应该添加一秒钟,以将最后一个值包括在可能的范围内,例如:
int randomSecondOfDay =
secondOfDayTime1 + random.nextInt(secondOfDayTime2-secondOfDayTime1 + 1);
答案 1 :(得分:1)
long totalNanos = Math.abs(ChronoUnit.NANOS.between(time1, time2));
long randomNanos = ThreadLocalRandom.current().nextLong(totalNanos);
LocalTime firstTime = time2.isAfter(time1) ? time1 : time2;
LocalTime randomTime = firstTime.plusNanos(randomNanos);
System.out.println(randomTime);
我刚才运行代码时,它就打印了
14:29:55.815373666
如果您希望它的细粒度不高,则可以用毫秒或秒,分钟甚至几小时来类似地进行操作。我之所以使用ThreadLocalRandom
的原因是,它在一定范围内提供了随机的长度。如果愿意,可以将毫秒级或更长的时间转换为int
并改用标准Random
类。
我假设一个半开间隔,即有时(很少)结果等于time1
而从不等于time2
。如果您还需要其他功能,我可以在正确的地方留给您加减1吗? davidxxx’ answer也会处理此问题。