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
}

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

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


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.


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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.