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
}

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

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


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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.