Elegante Methode zum Generieren eines Arrays zufälliger Daten innerhalb von zwei Daten

86

Ich habe einen Datepicker, bei dem ich zwei Monate zeige, und ich möchte zufällig 3 Daten in jedem sichtbaren Monat auswählen

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

Hier ist meine Berechnung

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
quelle

Antworten:

248

Vielleicht fehlt mir etwas, aber ist es das nicht?

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
quelle
1
Vielleicht - können Sie das für 3 Daten ohne Überschneidung in jedem Monat tun?
Mplungjan
1
Mit Überlappungen meinen Sie, dasselbe Datum zu generieren? Nein, dieser Code ist nicht diesen Fall behandeln, kann es theoretisch das gleiche Datum generiert (vor allem , wenn Sie Zeit gestutzt). Aber es sollte nicht schwer sein, Duplikate loszuwerden.
Tomasz Nurkiewicz
2
Verwandte Funktion zum Abrufen eines Datums einige Tage vor (oder nach) dem angegebenen Datum: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Herbst Leonard
31
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))
Demven Weir
quelle
5

Verwenden Sie die Antwort von Moment.js && @Demven Weir , um einen Zeichenfolgenwert wie "03/02/1975" zu erhalten.

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

HINWEIS: Fügen Sie jeweils eine Null hinzu, um die Anzahl der produzierten Jahre zu verlängern.

SoEzPz
quelle
1

Sie können die Grenzdaten in Ganzzahlen ( Date.getTime()) konvertieren und dann verwenden Math.random(), um Ihre zufälligen Daten innerhalb bestimmter Grenzen zu generieren. Gehen Sie dann zurück zu DateObjekten mit Date.setTime().

Bububaba
quelle
x mal ohne Wiederholung (hier x = 3)?
Mplungjan
Es geht darum, eine Schleife und ein Array bereits generierter Daten hinzuzufügen, die beim Generieren eines neuen überprüft werden müssen. Oder fehlt mir etwas?
Bububaba