วิธีการที่หรูหราในการสร้างอาร์เรย์ของวันที่สุ่มภายในสองวันที่


89

ฉันมี datepicker ที่ฉันแสดงสองเดือนและฉันต้องการสุ่มเลือกวันที่ 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
}

คำตอบ:


259

บางทีฉันอาจจะขาดอะไรไป แต่มันไม่ใช่เหรอ?

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
การซ้อนทับคุณหมายถึงการสร้างวันที่เดียวกันหรือไม่? ไม่รหัสนี้ไม่ได้จัดการกับกรณีนี้ในทางทฤษฎีมันสามารถสร้างวันที่เดียวกันได้ (โดยเฉพาะอย่างยิ่งเมื่อคุณตัดทอนเวลา) แต่ไม่ควรยากที่จะกำจัดรายการที่ซ้ำกัน
Tomasz Nurkiewicz

2
ฟังก์ชั่นที่เกี่ยวข้องสำหรับการหาวันที่หลายวันก่อน (หรือหลัง) วันที่ที่กำหนด: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Autumn Leonard


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()เพื่อสร้างวันที่สุ่มของคุณภายในขอบเขตที่กำหนด จากนั้นกลับไปที่วัตถุที่มีDateDate.setTime()


x ครั้งโดยไม่ต้องทำซ้ำ (ที่นี่ x = 3)?
mplungjan

เรื่องของการเพิ่มลูปและอาร์เรย์ของวันที่ที่สร้างไว้แล้วเพื่อตรวจสอบเมื่อสร้างใหม่ หรือฉันขาดอะไรไป?
bububaba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.