在JAVA中生成特定范围内的随机日期

11

只需从随机时间戳创建日期。 - shmosel
请在发布问题前彻底搜索 Stack Overflow。 - Basil Bourque
3个回答

21

考虑到您的问题不够明确,我想您是在尝试生成给定范围内的随机java.util.Date

请注意,java.util.Date包含日期和时间信息。

在Java中,Date由自纪元以来的毫秒数表示。因此,实现您的需求最简单的方法是,假设d1和d2是Date,且d1 < d2(伪代码):

Date randomDate = new Date(ThreadLocalRandom.current()
                              .nextLong(d1.getTime(), d2.getTime()));

如果你想生成一个实际上是“日期”(没有时间)的值,通常可以使用LocalDate(在Java 8+中或使用JODA Time)进行表示。

只需假设d1和d2是LocalDate,并且d1 < d2(伪代码):

int days = Days.daysBetween(d1, d2).toDays();
LocalDate randomDate = d1.addDays(
        ThreadLocalRandom.current().nextInt(days+1));

2
在Java 8中,您必须首先获取ThreadLocalRandom的实例才能调用nextLong方法。ThreadLocalRandom.current()例如: Date randomDate = new Date(ThreadLocalRandom.current().nextLong(d1.getTime(), d2.getTime())); - Imtiaz Shakil Siddique
1
@ImtiazShakilSiddique 感谢您发现错误。实际上,这个问题甚至在JDK8之前就存在了。让我来修复它。 - Adrian Shum

11

试试这个

    LocalDate startDate = LocalDate.of(1990, 1, 1); //start date
    long start = startDate.toEpochDay();
    System.out.println(start);

    LocalDate endDate = LocalDate.now(); //end date
    long end = endDate.toEpochDay();
    System.out.println(start);

    long randomEpochDay = ThreadLocalRandom.current().longs(start, end).findAny().getAsLong();
    System.out.println(LocalDate.ofEpochDay(randomEpochDay)); // random date between the range

2
为什么不使用 ThreadLocalRandom.current().nextLong(start, end) 而是创建一个流呢? - Tvaroh

7
您可以像这样做:

您可以这样做

    long random = ThreadLocalRandom.current().nextLong(startDate.getTime(), endDate.getTime());
    Date date = new Date(random);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接