Elegant method to generate array of random dates within two dates

JavascriptDateRandomJquery Ui-Datepicker

Javascript Problem Overview


I have a datepicker where I show two months and I want to randomly choose 3 dates in each visible month

  $('.date').datepicker({
    minDate: new Date(),
    dateFormat: 'DD, MM, d, yy',
    constrainInput: true,
    beforeShowDay: processDates,
    numberOfMonths: 2,
    showButtonPanel: true,
    showOn: "button",
    buttonImage: "images/calendar_icon.jpg",
    buttonImageOnly: true    
  });

Here is my calculation

var now = new Date();
var nowTime = parseInt(now.getTime()/1000);
var randomDateSet = {};

function getRandomSet(y,m) {
  var monthIndex = "m"+y+""+m; // m20121 for Jan
  if (randomDateSet[monthIndex]) return randomDateSet[monthIndex];
  // generate here
.
. - I need this part
.
  return randomDateSet[monthIndex];
}

function processDay(date) { // this is calculated for each day so we need a singleton for the array
  var dateTime = parseInt(date.getTime()/1000);
  if (dateTime <= (nowTime-86400)) {
    return [false]; // earlier than today
  }
  var m = date.getMonth(), d = date.getDate(), y = date.getFullYear();
  var randomDates = getRandomSet(y,m);

  for (i = 0; i < randomDates.length; i++) {
    if($.inArray((m+1) + '-' + d + '-' + y,randomDates) != -1 || new Date() > date) {
      return [true,"highlight","Some message"];
    }
  }
  return [true,"normal"]; // ordinary day
}

Javascript Solutions


Solution 1 - Javascript

Maybe I am missing something, but isn't this it?

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

const d = randomDate(new Date(2012, 0, 1), new Date());
console.log(d);

Solution 2 - Javascript

new Date(+(new Date()) - Math.floor(Math.random()*10000000000))

Solution 3 - Javascript

> Using Moment.js && @Demven Weir's answer to get a string value like "03/02/1975".

moment(new Date(+(new Date()) - Math.floor(Math.random()*10000000000)))
.format('MM/DD/YYYY');

NOTE: Keep adding a zero at a time to increase the span of years produced.

Solution 4 - Javascript

You can convert the boundary dates to integers (Date.getTime()) and then use Math.random() to generate your random dates within given boundaries. Then go back to Date objects with Date.setTime().

Solution 5 - Javascript

function generateRandomDate() {
return new Date(+(new Date()) - Math.floor(Math.random() * 10000000000));
}

(new generateRandomDate()).toLocaleDateString('en-US')

You will get a random date in US format 4/25/2021

See this Demo on jsfiddle

Solution 6 - Javascript

You can use this snippet to get random date and format;

const emptyDate = new Date();
const randomDate = new Date();
const dateFormatter = Intl.DateTimeFormat('sv-SE');
const formattedRandomDate = dateFormatter.format(emptyDate.setDate(randomDate.getDate() - Math.floor(Math.random()*1000)));

Solution 7 - Javascript

From examples in date-fns

const result = eachDayOfInterval({
  start: new Date(2014, 9, 6),
  end: new Date(2014, 9, 10)
})

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmplungjanView Question on Stackoverflow
Solution 1 - JavascriptTomasz NurkiewiczView Answer on Stackoverflow
Solution 2 - JavascriptDemven WeirView Answer on Stackoverflow
Solution 3 - JavascriptSoEzPzView Answer on Stackoverflow
Solution 4 - JavascriptbububabaView Answer on Stackoverflow
Solution 5 - JavascriptHusam EbishView Answer on Stackoverflow
Solution 6 - JavascriptMahir UsluView Answer on Stackoverflow
Solution 7 - JavascriptUltrahalfView Answer on Stackoverflow