Генерация случайных дат между датой начала и датой окончания в формате utc с использованием javascript

Как я могу генерировать случайные даты между двумя датами в формате utc, используя javascript? пример: дата начала 23-01-25 02:07:04 и дата окончания 23-02-25 02:07:04 Мне нужен список случайных дат между датой начала и датой окончания, как показано ниже: [23-01-26 02:07:04,23-02-02 02:07:04,.....]

Это мой код Javasxript:

function randomDate(start, end) {
    return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}

const d = randomDate(new Date(2023, 04, 01), new Date(2023, 04, 12));
console.info(d);

Но это дает неправильный вывод:

2023-05-08T17:09:26.445Z

Может ли кто-нибудь предложить мне правильный способ получить решение

Что делает вывод «неправильным»? Выглядит нормально для меня. (Обратите внимание, что в датах JavaScript месяцы нумеруются с 0, поэтому ваш код запрашивает случайную дату в начале мая месяца.)

Pointy 24.04.2023 15:01

Месяцы начинаются с 0 в js. 11 это декабрь

Konrad 24.04.2023 15:02
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…: «monthIndex: целочисленное значение, представляющее месяц, начиная с 0 для января и заканчивая 11 для декабря». - вы установили даты начала и окончания, которые приходятся на май 2023 года.
CBroe 24.04.2023 15:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как уже упоминалось, месяцы в JavaScript индексируются от 0 до 11.

См.: Date.prototype.setMonth()

monthValue
Целое число, представляющее месяц: 0 — январь, 1 — февраль и т. д.

const
  startDate = new Date(2023, 4, 1), // 2023-05-01
  endDate = new Date(2023, 4, 12);  // 2023-05-12

// Generate 1 million random dates between the provided range...
for (let i = 0; i < 1_000_000; i++) {
  const randomDate = getRandomDate(startDate, endDate);
  if (randomDate < startDate || startDate > endDate) {
    throw new Error(`Date out of range: ${randomDate}`);
  }
}

// Should get here if there are no range errors...
console.info('No errors...');

function getRandomDate(startDate, endDate) {
  if (arguments.length === 1) {
    endDate = new Date(startDate.getTime());
    startDate = new Date();
  }
  return new Date(getRandomInt(startDate.getTime(), endDate.getTime()));
}

function getRandomInt(min, max) {
  if (arguments.length === 1) {
    max = min;
    min = 0;
  }
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

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

function randomDate(start, end){
  var start_date_arr = start.split('-');
  if (start_date_arr[0].length == 2){
     start_date_arr[0] = '20' + start_date_arr[0]
  }
  var start_date = new Date(start_date_arr[0], start_date_arr[1] - 1, start_date_arr[2].substr(0, 2), start_date_arr[2].substr(3, 2), start_date_arr[2].substr(6, 2), start_date_arr[2].substr(9, 2));
  var start_time = start_date.getTime();

  var end_date_arr = end.split('-');
  if (end_date_arr[0].length == 2){
     end_date_arr[0] = '20' + end_date_arr[0]
  }
  var end_date = new Date(end_date_arr[0], end_date_arr[1] - 1, end_date_arr[2].substr(0, 2), end_date_arr[2].substr(3, 2), end_date_arr[2].substr(6, 2), end_date_arr[2].substr(9, 2));
  var end_time = end_date.getTime();


  var random_time = Math.floor(Math.random() * (end_time - start_time + 1)) + start_time;
  var random_date = new Date(random_time);

  console.info([start, end, random_date.toISOString().slice(0, 19).replace('T', ' ')]);
  return random_date;
}

 randomDate('23-01-25 02:07:04', '23-02-25 02:07:04');

Другие вопросы по теме