2012-01-27 6 views
50

Mam datepicker gdzie pokażę dwa miesiące i chcę losowo wybrać 3 daty każdego widocznego miesiącaelegancki sposób, aby wygenerować szereg przypadkowych terminach w ciągu dwóch terminach

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

Oto moja kalkulacja

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 
} 

Odpowiedz

158

Może czegoś brakuje, ale czyż nie?

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

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

Być może - czy możesz to zrobić przez 3 daty bez nakładania się w każdym miesiącu? – mplungjan

+0

Przez * nakładanie się * masz na myśli generowanie tej samej daty? Nie, ten kod ** nie ** obsługuje tej sprawy, teoretycznie może wygenerować tę samą datę (szczególnie gdy skrócisz czas). Ale nie powinno być trudno pozbyć się duplikatów. –

+2

Powiązana funkcja do otrzymania daty na kilka dni przed (lub po) podaną datą: 'funkcja randomDateAfterDate (start, dni) { return new Date (start.getTime() + (Math.random() * dni * 24 * 60 * 60 * 1000)); } ' –

1

Możesz konwertować daty graniczne na liczby całkowite (Date.getTime()), a następnie użyć Math.random(), aby wygenerować losowe daty w obrębie określonych granic. Następnie wróć do obiektów Date za pomocą Date.setTime().

+0

x razy bez powtarzania (tutaj x = 3)? – mplungjan

+0

Kwestia dodania pętli i tablicy już wygenerowanych dat do sprawdzenia przy generowaniu nowej. Czy może czegoś brakuje? – bububaba

+0

Oczywiście - ale elegancko? – mplungjan

2
new Date(+(new Date()) - Math.floor(Math.random()*10000000000)) 
Powiązane problemy