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
}

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

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


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.


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.