1

我想得到一个生成从现在到 2685 天的时间和一个随机时间的日期。我接受的格式必须是“uuuu-MM-dd'T'HH: mm: ssZ”。目前我的程序正在生成一个随机日期,但我无法创建一个随机时间,因为 Duration 与 Period 冲突

public static String generateRandomDateAndTimeInString() {
    LocalDate date = LocalDate.now()
            .minus(Period.ofDays((new Random().nextInt(2685))));
    return formatDate(date);
}

public static String formatDate(LocalDate date) {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ");
    return date.atStartOfDay().atOffset(ZoneOffset.UTC).format(dtf);
}
4

2 回答 2

2
    Instant now = Instant.now();
    Instant then = now.minus(2685, ChronoUnit.DAYS);
    long millisBetween = ChronoUnit.MILLIS.between(then, now);
    Instant randomTime = then.plusMillis(ThreadLocalRandom.current().nextLong(millisBetween));
    
    System.out.println(randomTime);

示例输出:

2019-09-13T10:21:21.078242Z

如果你不想要秒的分数:

    System.out.println(randomTime.truncatedTo(ChronoUnit.SECONDS));

2019-09-13T10:21:21Z

我发现只绘制一个随机数并让它决定日期和时间比单独绘制日期和时间更简单。具有提供随机绘制有界的选项ThreadLocalRandom的优势。这种方式也有产生今天时间的理论上的可能性,但仅限于已经过去的一天中的一部分。Randomlong

我正在利用这样一个事实,即您要求的格式与其方法Instant产生的结果一致。toString该格式称为 ISO 8601,是一种国际标准(ISO 代表国际标准化组织)。

链接

于 2021-05-07T18:09:32.393 回答
1

可能是这样的事情?

public static String generateRandomDateAndTimeInString() {
    ThreadLocalRandom random = ThreadLocalRandom.current();
    LocalDate date = LocalDate.now()
            .minus(Period.ofDays((random.nextInt(2685))));


    LocalTime time = LocalTime.of(random.nextInt(0, 23), random.nextInt(0, 59), random.nextInt(0, 59));

    return formatDate(LocalDateTime.of(date, time));
}

public static String formatDate(LocalDateTime date) {
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssZ");
    return date.atOffset(ZoneOffset.UTC).format(dtf);
}
于 2021-05-07T17:48:12.430 回答