98 votes

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

J'ai un sélecteur de dates 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
}

292voto

Tomasz Nurkiewicz Points 140462

Peut-être que j'ai raté 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())

39voto

Dementor Points 46
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))

10voto

SoEzPz Points 71

Utilisation de la réponse de Moment.js && @Demven Weir pour obtenir une valeur de chaîne telle que "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 le nombre d'années produites.

1voto

bububaba Points 2154

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

0voto

Husam Ebish Points 370
function generateRandomDate() {
return new Date(+(new Date()) - Math.floor(Math.random() * 10000000000));
}

(new generateRandomDate()).toLocaleDateString('en-US')

Vous obtiendrez une date aléatoire au format américain 4/25/2021

Voir cette démo sur jsfiddle

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X