İki tarih içinde rastgele tarih dizisi oluşturmak için zarif yöntem


89

İki ayı gösterdiğim bir tarih seçicim var ve görünür her ay için rastgele 3 tarih seçmek istiyorum

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

İşte benim hesaplamam

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
}

Yanıtlar:


259

Belki bir şeyi kaçırıyorum, ama bu değil mi?

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

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

1
Belki - bunu her ay çakışmadan 3 tarih için yapabilir misiniz?
mplungjan

1
By örtüşme aynı tarih üreten demek? Hayır, bu kod yok değil (zaman kesecek özellikle) teorik olarak aynı tarih üretebilir, bu durumda idare. Ancak kopyalardan kurtulmak zor olmamalı.
Tomasz Nurkiewicz

2
Verilen tarihten birkaç gün önce (veya sonra) bir tarih almak için ilgili işlev: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Sonbahar Leonard


6

Kullanılması Moment.js && @Demven Weir cevabı "03/02/1975" gibi bir dize değeri alır.

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

NOT: Üretilen yıl aralığını artırmak için her seferinde sıfır eklemeye devam edin.


1

Sınır tarihlerini tamsayılara ( Date.getTime()) dönüştürebilir ve ardından Math.random()verilen sınırlar içinde rastgele tarihlerinizi oluşturmak için kullanabilirsiniz . Ardından ile Datenesnelere geri dönün Date.setTime().


x kez tekrar etmeden (burada x = 3)?
mplungjan

Yeni bir döngü oluştururken kontrol etmek için bir döngü ve önceden oluşturulmuş tarihler dizisi ekleme meselesi. Yoksa bir şey mi kaçırıyorum?
bububaba
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.