Metodo elegante per generare un array di date casuali all'interno di due date


89

Ho un datepicker in cui mostro due mesi e voglio scegliere casualmente 3 date in ogni mese visibile

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

Ecco il mio calcolo

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
}

Risposte:


259

Forse mi manca qualcosa, ma non è questo?

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

randomDate(new Date(2012, 0, 1), new Date())

1
Forse - puoi farlo per 3 date senza sovrapposizioni in ogni mese?
mplungjan,

1
Per sovrapposizioni intendi generare la stessa data? No, questo codice non gestisce questo caso, teoricamente può generare la stessa data (soprattutto quando si tronca l'ora). Ma non dovrebbe essere difficile sbarazzarsi dei duplicati.
Tomasz Nurkiewicz

2
Funzione correlata per ottenere una data un numero di giorni prima (o dopo) la data specificata: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Autumn Leonard

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

6

Utilizzando la risposta di Moment.js && @Demven Weir per ottenere un valore di stringa come "03/02/1975".

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

NOTA: continuare ad aggiungere uno zero alla volta per aumentare l'intervallo di anni prodotti.


1

È possibile convertire le date di confine in numeri interi ( Date.getTime()) e quindi utilizzare Math.random()per generare le date casuali entro determinati limiti. Quindi torna agli Dateoggetti con Date.setTime().


x volte senza ripetere (qui x = 3)?
mplungjan,

Si tratta di aggiungere un ciclo e un array di date già generate da controllare quando si genera uno nuovo. Oppure mi sfugge qualcosa?
bububaba
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.