случайный DateTime в определенном диапазоне - PullRequest
0 голосов
/ 22 октября 2019

Здравствуйте, ищите пример кода, который вернет значение RandomDateTime как 1968-02-03 23:02:03 в диапазоне (1960,1970).

ГГГГ-ММ-ДД ЧЧ: ММ: СС,

мой код возвращает часовой пояс, между которыми я не хочу. ...

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

Вы можете получить дату Рэндона, используя класс ThreadLocalRandom. Вот быстрое решение для вас. Пожалуйста, проверьте следующий код.

Ввод:

Введите дату начала: дд / мм / гггг

01/01/1960

Введите дату окончания: дд / мм / гггг

01/01/1970

Выход:

1969-04-18 06:30: 54

        Scanner input = null;
        try {
            input = new Scanner(System.in);
            System.out.println("Enter the Start Date: dd/mm/yyyy");
            String begin = new String();
            begin = input.nextLine();
            SimpleDateFormat startFormat = new SimpleDateFormat("dd/mm/yyyy");
            Date startDate = startFormat.parse(begin);

            System.out.println("Enter the End Date: dd/mm/yyyy");
            String end = new String();
            end = input.nextLine();
            SimpleDateFormat endFormat = new SimpleDateFormat("dd/mm/yyyy");
            Date endDate = endFormat.parse(end);

            Date randomDate = new Date(ThreadLocalRandom.current()
                    .nextLong(startDate.getTime(), endDate.getTime()));

            String pattern = "yyyy-MM-dd hh:mm:ss";
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
            String randomDateFormat = simpleDateFormat.format(randomDate);
            System.out.println(randomDateFormat);

        }
        catch (Exception ex) {
            ex.printStackTrace();
        }finally{
            input.close();
        }

Надеюсь, что это решение работает.

3 голосов
/ 22 октября 2019

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...