生成特定范围内的随机LocalTime

时间:2018-07-17 12:04:52

标签: java localtime

我有两个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这样的完整小时数。

2 个答案:

答案 0 :(得分:3)

首先检查time2之后是time1
然后,您可以将LocalTime实例转换为代表一天中秒数的longLocalTime.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也会处理此问题。