2012-01-27 33 views
50

Tôi có một datepicker nơi tôi thấy hai tháng và tôi muốn một cách ngẫu nhiên chọn 3 ngày trong mỗi tháng có thể nhìn thấyphương pháp Elegant để tạo mảng các ngày ngẫu nhiên trong vòng hai ngày

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

Trả lời

158

Có thể tôi đang thiếu thứ gì đó, nhưng phải không?

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ó thể - bạn có thể làm điều đó trong 3 ngày mà không trùng lặp trong mỗi tháng không? – mplungjan

+0

Bằng * chồng chéo * bạn có nghĩa là tạo cùng một ngày không? Không, mã này không ** 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 ngắn thời gian). Nhưng không khó để loại bỏ các bản sao. –

+2

Chức năng liên quan để nhận được ngày một số ngày trước (hoặc sau) ngày đã cho: 'chức năng randomDateAfterDate (bắt đầu, ngày) { trả về ngày mới (start.getTime() + (Math.random() * ngày * 24 * 60 * 60 * 1000)); } ' –

1

Bạn có thể chuyển đổi ngày tháng 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 Date các đối tượng với Date.setTime().

+0

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

+0

Một vấn đề của việc thêm một vòng lặp và một mảng các ngày đã tạo để kiểm tra khi tạo mới. Hay tôi đang thiếu một cái gì đó? – bububaba

+0

Chắc chắn - nhưng thanh lịch? – mplungjan

2
new Date(+(new Date()) - Math.floor(Math.random()*10000000000)) 
Các vấn đề liên quan