Елегантний метод для створення масиву випадкових дат протягом двох дат


88

У мене є програма вибору дати, де я показую два місяці, і я хочу навмання вибрати 3 дати у кожному видимому місяці

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

Ось мій розрахунок

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
}

Відповіді:


254

Можливо, мені чогось не вистачає, але чи не це?

function randomDate(start, end) {
    return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}

randomDate(new Date(2012, 0, 1), new Date())

1
Можливо - чи можете ви це робити протягом 3 дат без перекриття кожного місяця?
mplungjan

1
Під дублюванням ви розумієте створення тієї самої дати? Ні, цей код не розглядає цей випадок, теоретично він може генерувати ту саму дату (особливо коли ви скорочуєте час). Але позбутися дублікатів не повинно бути важко.
Томаш Нуркевич,

2
Пов’язана функція для отримання дати за кілька днів до (або після) даної дати: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Осінній Леонард


6

Використовуючи відповідь Moment.js && @Demven Weir, щоб отримати значення рядка, наприклад "03/02/1975".

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

ПРИМІТКА: Продовжуйте додавати нуль за раз, щоб збільшити проміжок років виробництва.


1

Ви можете перетворити дати меж у цілі числа ( Date.getTime()), а потім використовувати Math.random()для генерації випадкових дат у заданих межах. Потім поверніться до Dateоб’єктів за допомогою Date.setTime().


x разів без повторення (тут x = 3)?
mplungjan

Справа у додаванні циклу та масиву вже згенерованих дат для перевірки при створенні нової. Або мені чогось не вистачає?
bububaba
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.