120

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
}
mplungjan
  • 169,008
  • 28
  • 173
  • 236

7 Answers7

328

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);
deb
  • 6,671
  • 2
  • 11
  • 27
Tomasz Nurkiewicz
  • 334,321
  • 69
  • 703
  • 674
  • 1
    Perhaps - can you do that for 3 dates without overlap in each month? – mplungjan Jan 27 '12 at 15:46
  • 1
    By *overlaps* do you mean generating the same date? No, this code does **not** handle this case, theoretically it can generate the same date (especially when you truncate time). But it shouldn't be hard to get rid of duplicates. – Tomasz Nurkiewicz Jan 27 '12 at 15:50
  • 3
    Related function for getting a date a number of days before (or after) the given date: `function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }` – Autumn Leonard Nov 17 '15 at 15:29
  • to test @AutumnLeonard example for the case when we need the number of days before the given date we can use minus sign - randomDateAfterDate(new Date(2021, 4, 5), -365) – SAndriy May 05 '21 at 10:22
56

console.log(
  new Date(new Date() - Math.random()*(1e+12))
)
vsync
  • 118,978
  • 58
  • 307
  • 400
Demven Weir
  • 807
  • 7
  • 6
10

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.

SoEzPz
  • 14,958
  • 8
  • 61
  • 64
2
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

Husam Ebish
  • 4,893
  • 2
  • 22
  • 38
1

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().

bububaba
  • 2,840
  • 6
  • 25
  • 29
0

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)));
Mahir Uslu
  • 21
  • 4
0

From examples in date-fns

const result = eachDayOfInterval({
  start: new Date(2014, 9, 6),
  end: new Date(2014, 9, 10)
})
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129