Méthode élégante pour générer un tableau de dates aléatoires dans deux dates

88

J'ai un sélecteur de date où j'affiche deux mois et je veux choisir au hasard 3 dates dans chaque mois visible

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

Voici mon calcul

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
la source

Réponses:

254

Peut-être que je manque quelque chose, mais n'est-ce pas?

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
la source
1
Peut-être - pouvez-vous faire cela pour 3 dates sans chevauchement chaque mois?
mplungjan
1
Par chevauchements , voulez-vous dire générer la même date? Non, ce code ne gère pas ce cas, théoriquement il peut générer la même date (surtout lorsque vous tronquez l'heure). Mais il ne devrait pas être difficile de se débarrasser des doublons.
Tomasz Nurkiewicz
2
Fonction associée pour obtenir une date un certain nombre de jours avant (ou après) la date donnée: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Autumn Leonard
32
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))
Demven Weir
la source
6

Utilisation de la réponse de Moment.js && @Demven Weir pour obtenir une valeur de chaîne comme "03/02/1975".

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

REMARQUE: Continuez à ajouter un zéro à la fois pour augmenter la durée des années produites.

SoEzPz
la source
1

Vous pouvez convertir les dates limites en nombres entiers ( Date.getTime()), puis les utiliser Math.random()pour générer vos dates aléatoires dans des limites données. Revenez ensuite aux Dateobjets avec Date.setTime().

bububaba
la source
x fois sans répétition (ici x = 3)?
mplungjan
Il s'agit d'ajouter une boucle et un tableau de dates déjà générées à vérifier lors de la création d'une nouvelle. Ou est-ce que je manque quelque chose?
bububaba