Método elegante para generar una matriz de fechas aleatorias dentro de dos fechas

88

Tengo un selector de fechas donde muestro dos meses y quiero elegir al azar 3 fechas en cada mes visible

  $('.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    
  });

Aquí está mi cálculo

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
fuente

Respuestas:

255

Quizás me esté perdiendo algo, pero ¿no es así?

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

randomDate(new Date(2012, 0, 1), new Date())
Tomasz Nurkiewicz
fuente
1
Tal vez, ¿puedes hacer eso durante 3 fechas sin superposición en cada mes?
mplungjan
1
¿Por superposiciones te refieres a generar la misma fecha? No, este código no maneja este caso, teóricamente puede generar la misma fecha (especialmente cuando trunca el tiempo). Pero no debería ser difícil deshacerse de los duplicados.
Tomasz Nurkiewicz
2
Función relacionada para obtener una fecha varios días antes (o después) de la fecha indicada: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Autumn Leonard
32
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))
Demven Weir
fuente
6

Usando la respuesta de Moment.js && @Demven Weir para obtener un valor de cadena como "03/02/1975".

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

NOTA: Siga agregando un cero a la vez para aumentar el lapso de años producidos.

SoEzPz
fuente
1

Puede convertir las fechas límite en números enteros ( Date.getTime()) y luego usar Math.random()para generar sus fechas aleatorias dentro de los límites dados. Luego vuelve a los Dateobjetos con Date.setTime().

bububaba
fuente
x veces sin repetir (aquí x = 3)?
mplungjan
Es cuestión de agregar un bucle y una matriz de fechas ya generadas para verificar al generar uno nuevo. ¿O me estoy perdiendo algo?
bububaba