【问题标题】:Generating random date in a specific range in JAVA [duplicate]在JAVA中生成特定范围内的随机日期[重复]
【发布时间】:2016-10-26 03:39:53
【问题描述】:

如何在 JAVA 中生成特定范围内的随机日期?我已经看到How do I generate random integers within a specific range in Java? 链接是生成随机数。在JAVA 中是否有类似/其他类型的生成随机日期的方法?

【问题讨论】:

  • 只需从随机时间戳创建一个日期。
  • 请在发帖前彻底搜索 Stack Overflow。

标签: java algorithm date


【解决方案1】:

鉴于您的问题不清楚,我希望您尝试生成具有给定范围的随机 java.util.Date。

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

Date 在 Java 中以 EPOCH 的毫秒数表示。因此,做你想做的最简单的方法是,给定 d1 和 d2 是Date,并且 d1

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

如果它实际上是您想要生成的“日期”(没有时间),通常由 LocalDate 表示(在 Java 8+ 中,或使用 JODA 时间)。

这很简单,假设 d1 和 d2 为 LocalDate,d1 < d2(伪代码):

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

【讨论】:

  • 在 Java 8 中,您必须首先获取 ThreadLocalRandom 的实例才能调用 nextLong 方法。 ThreadLocalRandom.current() 示例如下:Date randomDate = new Date(ThreadLocalRandom.current().nextLong(d1.getTime(), d2.getTime()));
  • @ImtiazShakilSiddique 感谢您发现错误。甚至在 JDK8 之前也是如此。让我修复它
【解决方案2】:

试试这个

    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

【讨论】:

  • 为什么不使用ThreadLocalRandom.current().nextLong(start, end) 而不是创建流?
【解决方案3】:

你可以这样做

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 2015-04-08
    • 2021-07-10
    • 2017-04-21
    • 2012-12-01
    • 2018-11-06
    • 2016-05-04
    相关资源
    最近更新 更多