Elegancka metoda generowania tablicy losowych dat w dwóch datach

88

Mam datepicker, w którym pokazuję dwa miesiące i chcę losowo wybrać 3 daty w każdym widocznym miesiącu

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

Oto moje obliczenia

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
źródło

Odpowiedzi:

255

Może czegoś mi brakuje, ale czy to nie jest to?

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
źródło
1
Być może - czy możesz to zrobić przez 3 terminy bez nakładania się w każdym miesiącu?
mplungjan
1
Czy przez nakładanie się masz na myśli generowanie tej samej daty? Nie, ten kod nie obsługuje tego przypadku, teoretycznie może wygenerować tę samą datę (zwłaszcza gdy skracasz czas). Ale pozbycie się duplikatów nie powinno być trudne.
Tomasz Nurkiewicz
2
Powiązana funkcja uzyskiwania daty na kilka dni przed (lub po) podanej dacie: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Jesień Leonard
32
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))
Demven Weir
źródło
6

Używając odpowiedzi Moment.js && @Demven Weir, aby uzyskać wartość ciągu, taką jak „03/02/1975”.

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

UWAGA: Dodawaj zero naraz, aby wydłużyć okres produkowanych lat.

SoEzPz
źródło
1

Możesz przekonwertować daty graniczne na liczby całkowite ( Date.getTime()), a następnie użyć Math.random()do wygenerowania losowych dat w określonych granicach. Następnie wróć do Dateobiektów z Date.setTime().

bububaba
źródło
x razy bez powtórzeń (tutaj x = 3)?
mplungjan
Kwestia dodania pętli i tablicy już wygenerowanych dat do sprawdzenia podczas generowania nowej. A może coś mi brakuje?
bububaba