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
}

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

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


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.


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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.