2010-12-10 8 views
0

Ich habe eine Kette von Jahr, Monat Start Tag und Ende Tage Elemente auswählen .. Jahre und natürlich Monate sind verfügbar, aber das Problem ist mit der Anzahl der Tage des ausgewählten Monats ausgewählt werden als Starttag!Problem beim Abrufen der Anzahl der Tage in einem Monat in Javascript

Ich verwende dies in der JS-Datei days = new Date(2010, 4, 0).getDate(); // returns 29, die 30 sein soll!

wo ist das Problem, ich sicher, dass der Tage in jedem Monat von php cal_days_in_month (0, 4, 2010) hergestellt, die 30

Vielen Dank im Voraus zurück :)

Antwort

1

Wenn Sie nur das Datum akzeptieren ist 1-basiert, ein kleiner Trick, den Sie die Anzahl der Tage eines Monats geben würde:

function getDaysForMonth(m,y){ 
    var datebase = new Date(y,m,1); //nb: month = zerobased 
    datebase.setDate(datebase.getDate()-1); 
    return datebase.getDate(); 
} 

Sagen wir es für einige februari des nehmen:

var feb2000 = getDaysForMonth(2,2000); //=> 29 
var feb2004 = getDaysForMonth(2,2004); //=> 29 
var feb2008 = getDaysForMonth(2,2008); //=> 29 
var feb2010 = getDaysForMonth(2,2010); //=> 28 

Sie können eine Date.prototype Methode für sie machen:

Date.prototype.daysThisMonth = function(){ 
var x = new Date(this.getFullYear(),this.getMonth()+1,1); 
x.setDate(x.getDate()-1); 
return x.getDate(); 
}; 
//usage 
var d1 = new Date('2010/2/23').daysThisMonth() //=> 28 
//nb new Date('2010/2/23') in your notation: new Date(2010,1,23) 
+0

Gleiche Ergebnisse, der vierte Monat = 29! ... – Dewan159

+0

Ich weiß nicht, was du tust, aber neues Date ('2010/04/23'). DaysThisMonth() = 30 hier; – KooiInc

0

ich date.js verwenden. Es hat zahlreiche praktische Datumsfunktionen.

+0

ein Kommentar sein sollte meiner bescheidenen Meinung nach. – KooiInc

0

Ihr Code

new Date(2010, 4, 0) 

... ist falsch; Es kann in einigen Implementierungen funktionieren, aber nicht in anderen. Der Date-Konstruktor benötigt Jahr, Monat, Tag, Stunde, Minute und Sekunde (alles außer und month ist optional, denn wenn Sie einen Einargumentkonstruktor verwenden, wird angenommen, dass Sie einen Millisekunden-seit-The-Epoch Wert angeben), und der Monat ist 0-basiert, aber der Tag ist 1-basiert (ja, wirklich   — hey, ich habe es nicht entworfen). Also der erste April ist new Date(2010, 3, 1) (0 = Januar, 1 = Februar, = März, 3 = April) und es gibt keinen Tag des Monats 0 (gemäß Abschnitt 15.9.1.5 der Spezifikation, der Bereich ist 1. .31).

+0

Danke, aber ich habe Ihren Punkt nicht wirklich bekommen! :), hier ist, wo ich den Code: http://www.electrictoolbox.com/javascript-days-in-month/ – Dewan159

+2

@Dewan: Mein Punkt ist, dass ' neues Datum (2010, 4, 0) 'ist ungültig und könnte alles zurückgeben. Der dritte Wert kann nicht "0" sein (je nach Spezifikation muss "1" bis "31" inklusive sein), was bedeutet, dass Sie bekommen, was immer Sie bekommen und dem Sie nicht vertrauen können. –

0

In Google Chrome gibt sie nur 30:

document.write (Tage = new Date (2010, 4, 0) .getDate());

+0

firefox: 29!, Ist das Problem mit dem Browser jetzt oder was :) !!! – Dewan159

+0

firefox 3.6.13/w Firebug 1.6: neues Datum (2010,4,0).getDate() = 30 – KooiInc

0

Fabrikat Sie sicher, dass Sie den nächsten Monat als Argument verwenden, weil es nach hinten bewegt, wenn der Tag 0:

new Date(2012, 1, 0); //returns Jan not Feb 

Wenn dies ist etwas, das Sie häufig verwenden, erstellen Sie eine Funktion

function getDaysOfMonth(year, month){ 
    return new Date(year, month+1, 0).getDate() 
} 
Verwandte Themen