Metode elegan untuk menghasilkan berbagai tanggal acak dalam dua tanggal

89

Saya memiliki datepicker di mana saya menunjukkan dua bulan dan saya ingin secara acak memilih 3 tanggal di setiap bulan yang terlihat

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

Ini perhitungan saya

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.dll
sumber

Jawaban:

259

Mungkin saya melewatkan sesuatu, tetapi bukankah ini?

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
sumber
1
Mungkin - dapatkah Anda melakukannya selama 3 tanggal tanpa tumpang tindih di setiap bulan?
mplungjan
1
Yang Anda maksud dengan tumpang tindih adalah menghasilkan tanggal yang sama? Tidak, kode ini tidak menangani kasus ini, secara teoritis dapat menghasilkan tanggal yang sama (terutama saat Anda memotong waktu). Tetapi seharusnya tidak sulit untuk menghilangkan duplikat.
Tomasz Nurkiewicz
2
Fungsi terkait untuk mendapatkan tanggal beberapa hari sebelum (atau setelah) tanggal yang diberikan: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Autumn Leonard
33
new Date(+(new Date()) - Math.floor(Math.random()*10000000000))
Demven Weir
sumber
6

Menggunakan jawaban Moment.js && @Demven Weir untuk mendapatkan nilai string seperti "03/02/1975".

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

CATATAN: Terus tambahkan nol pada satu waktu untuk meningkatkan rentang tahun produksi.

SoEzPz
sumber
1

Anda dapat mengonversi tanggal batas menjadi bilangan bulat ( Date.getTime()) dan kemudian menggunakan Math.random()untuk menghasilkan tanggal acak Anda dalam batas yang diberikan. Kemudian kembali ke Dateobjek dengan Date.setTime().

bububaba
sumber
x kali tanpa pengulangan (di sini x = 3)?
mplungjan
Masalah menambahkan loop dan array tanggal yang sudah dibuat untuk diperiksa saat membuat yang baru. Atau apakah saya melewatkan sesuatu?
bububaba