2012-10-30 19 views
9

Czy istnieje sposób na wszystkie dni miesiąca lub roku? Szukam tego, aby wyłączyć niektóre dni w datepicker, chciałbym mieć stronę w back-office, aby wybrać te dni, aby wyłączyć.Znajdź wszystkie dni w miesiącu z obiektem Data?

Musiałbym więc wyświetlać wszystkie dni w miesiącu i dodawać przycisk "aktywuj lub wyłącz" poniżej każdego dnia. Czy istnieje sposób na znalezienie tych dni z obiektem Date? Znalazłem ten link na przykład: Displaying all the days of a month, ale tak naprawdę nie rozumiem, a także jest Java, próbuję znaleźć rozwiązanie w javascript.

Dziękuję za pomoc

+0

co naprawdę oznacza "znajdowanie tych dni" lub "mieć te dni"? Cel nie jest jasny – charlietfl

Odpowiedz

37

Aby uzyskać listę wszystkich dni w miesiącu, można rozpocząć od Date pierwszego dnia miesiąca, zwiększając dzień do zmiany miesiąca.

/** 
* @param {int} The month number, 0 based 
* @param {int} The year, not zero based, required to account for leap years 
* @return {Date[]} List with date objects for each day of the month 
*/ 
function getDaysInMonth(month, year) { 
    var date = new Date(year, month, 1); 
    var days = []; 
    while (date.getMonth() === month) { 
     days.push(new Date(date)); 
     date.setDate(date.getDate() + 1); 
    } 
    return days; 
} 

Przykład http://jsfiddle.net/kKj8h/1/

+0

Wielkie dzięki Juan, to jest dokładnie to, czego potrzebowałem! Wielkie dzięki – Paul

+0

Drobna korekta kodu date.setDate (date.getDate() + 1); powinieneś pójść przed datą.push array call – Timothy

+0

@Tymothy Co to jest przypadek testowy, że to nie działa? –

4

Nie jestem pewien na podstawie Twojego opisu, czy standardowy datownik zostanie wyłączony, więc odpowiem ci bezpośrednio.

Można skonstruować tablicę dni na miesiąc dość łatwo w ten sposób:

var numOfDays = new Date(2012, 10, 0).getDate(); //use 0 here and the actual month 
var days = new Array(); 

//This will construct an array with all the elements represent the day of the week 
//(i.e. Oct 30th would be days[30-1] or days[29]) and the value would be the actual 
//day of the week (i.e. Tuesday which is representing by the number 2) 
for(var i=0;i<=numOfDays;i++) 
{ 
    days[i] = new Date(2012,9,i+1).getDay(); //use month-1 here    
} 
//This will give you a number from 0 - 6 which represents (Sunday - Saturday) 
alert(days[29]); 

Stosując tę ​​tablicę dni można dość dużo robić, co chcesz z nim i poznać dzień również tydzień.

+0

dziękuję Jeremy za odpowiedź! – Paul

1

Oto loopp który biegnie przez każdego miesiąca w celu określenia ostatniego dnia tego miesiąca. Obiekt daty JavaScript indeksuje miesiące zaczynające się od zera, a jeśli ustawisz dzień na zero, powróci do ostatniego dnia poprzedniego miesiąca. Przydatny do określania roku przestępnym ostatni dzień lutego

Date(2012, 12, 0) powróci gru 31, 2012

Date (2012,0,0) powróci gru 31,2011

a wszystko ważne, aby dowiedzieć się, jest luty,

Date (2012,3,0) Zwraca 29 lut od roku przestępnym tym roku

var mos=['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'] 

for (i = 0; i < 12; i++) { 
    var lastDate = new Date(2012, i+1, 0); 
    $('body').append('Last day of ' + mos[i] + ' is ' + lastDate.getDate()+'<br>') 
} 

DEMO: http://jsfiddle.net/5k8sn/1/

+0

Dzięki charlietfl za odpowiedź! – Paul

1

Zaimplementowałem żądaną funkcjonalność za pomocą datepika jQuery.

pierwsze, dodać wszystkie daty wybrane w back office jest wyłączony do tablicy

// format yyyy-mm-dd 
var disabledDates = [ 
    "2012-10-01", 
    "2012-10-02", 
    "2012-10-30", 
    "2012-09-12" 
]; 

drugie, określić datepicker z dwóch funkcji

$("#datepicker").datepicker({ 

    // only enable date if dateEnabled returns [true] 
    beforeShowDay: dateEnabled, 

    // once a date has been selected call dateSelected 
    onSelect: dateSelected 
}); 

Oto definicja wymagana funkcje

function dateEnabled(d) { 

    // if date found in array disable date 
    if(disabledDates.indexOf(getDate(d)) > -1) { 

     return [false]; 

    } else { 

     return [true] ; 

    } 
} 

Konwertuj datę na ciąg w celu porównania z datami w tablicy

function getDate(d) { 
    var day, 
     month, 
     year; 

    day = d.getDate(); 
    month = d.getMonth() + 1; // add 1 as getMonth returns 0 - 11 
    year = d.getFullYear(); 

    if(month < 10) month = "0" + month; 
    if(day < 10) day = "0" + day; 
    return year + "-" + month + "-" + day; 
} 

Gdy data została wybrana to proces

function dateSelected(d) { 
    // do stuff with string representation of date           
} 

Oto ryba http://jsfiddle.net/KYzaR/7/

prostu pomyślałem, że warto byłoby wspomnieć, że Array.indexOf jest najnowszym dodatkiem do ECMA -262 standard i tak w przypadku IE7 i IE8 nie jest obsługiwany. Poniższa strona MDN zawiera kod implementujący Array.indexOf dla tych przeglądarek https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf

+0

wielkie dzięki, Bruno, właśnie tego szukałem! – Paul

+0

@Juan Mendes Nie jestem pewien, aby zrozumieć, co masz na myśli, w jaki sposób powinniśmy zrobić, jeśli nie używamy indexOf? – Paul

+0

@Juan Mendes w porządku, dzięki – Paul

Powiązane problemy