Phương pháp thanh lịch để tạo mảng ngày ngẫu nhiên trong vòng hai ngày


88

Tôi có một công cụ chọn ngày mà tôi hiển thị hai tháng và tôi muốn chọn ngẫu nhiên 3 ngày trong mỗi tháng hiển thị

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

Đây là tính toán của tôi

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
}

Câu trả lời:


254

Có lẽ tôi đang thiếu một cái gì đó, nhưng đây không phải là nó?

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

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

1
Có lẽ - bạn có thể làm điều đó trong 3 ngày không trùng lặp trong mỗi tháng?
mplungjan

1
Do chồng chéo có nghĩa là bạn tạo ra cùng một ngày? Không, mã này không xử lý trường hợp này, về mặt lý thuyết, nó có thể tạo ra cùng một ngày (đặc biệt là khi bạn cắt bớt thời gian). Nhưng không khó để loại bỏ các bản sao.
Tomasz Nurkiewicz

2
Chức năng liên quan để lấy ngày một số ngày trước (hoặc sau) ngày nhất định: function randomDateAfterDate(start, days) { return new Date(start.getTime() + (Math.random()*days*24*60*60*1000)); }
Autumn Leonard


6

Sử dụng câu trả lời của Moment.js && @Demven Weir để nhận giá trị chuỗi như "03/02/1975".

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

LƯU Ý: Tiếp tục thêm số 0 vào mỗi lần để tăng khoảng thời gian sản xuất.


1

Bạn có thể chuyển đổi các ngày ranh giới thành số nguyên ( Date.getTime()) và sau đó sử dụng Math.random()để tạo các ngày ngẫu nhiên của bạn trong các ranh giới nhất định. Sau đó quay lại Datecác đối tượng với Date.setTime().


x lần không lặp lại (ở đây x = 3)?
mplungjan

Vấn đề thêm một vòng lặp và một mảng các ngày đã được tạo để kiểm tra khi tạo mới. Hay tôi đang thiếu cái gì đó?
bububaba
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.