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
}

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

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


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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.