java.time
Random rand = new Random();
LocalDateTime minInclusive = LocalDateTime.of(1960, Month.JANUARY, 1, 0, 0);
LocalDateTime maxExclusive = LocalDateTime.of(1971, Month.JANUARY, 1, 0, 0);
int seconds = Math.toIntExact(ChronoUnit.SECONDS.between(minInclusive, maxExclusive));
int choice = rand.nextInt(seconds);
LocalDateTime randomDateTime = minInclusive.plusSeconds(choice);
System.out.println(randomDateTime);
Пример вывода (запущен только сейчас):
1960-12-05T19: 05: 28
Я использую LocalDateTime
, потому что вы сказали, что не хотите использовать часовой пояс, но вы рискуете получить несуществующее время, обычно время в весеннем промежутке, когда часы повернуты вперед, когда начинается летнее время (DST). Чтобы избежать этого риска, используйте ZonedDateTime
и укажите часовой пояс. Код будет очень похож на приведенный выше.
Вызов between
на ChronoUnit.SECONDS
рассчитывает прошедшее время как целые секунды.
вызов Math.toIntExact
- более безопасный способ перехода с 64-разрядного long
на 32-разрядный int
. Выдает исключение, если значение переполняется.
Вывод на печать randomDateTime
в формате ISO 8601 . Если вам нужен другой формат (например, без T
в середине), вы можете отформатировать его, используя DateTimeFormatter
. Поиск как .
Ссылка: Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time .