随机时间和日期

Random time and date

我想获取一个生成从现在到 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);
}

可能是这样的?

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);
}
    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

我发现只抽取一个随机数并让它决定日期和时间比分别抽取日期和时间更简单。 ThreadLocalRandomRandom 的优势在于提供了随机绘制 long 的选项。这种方式在理论上也有可能产生今天的时间,但仅限于已经过去的那部分时间。

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

链接