2012-01-28 6 views
9

Szukam sprawdzonego rozwiązania stałego do uzyskania bieżącego tygodnia w roku dla określonej daty. Wszystko, co mogę znaleźć, to te, które nie biorą pod uwagę lat przestępnych lub po prostu źle. Czy ktoś ma tego typu rzeczy?JavaScript Date.getWeek()?

Lub jeszcze lepiej funkcja, która mówi, ile miesięcy zajmuje miesiąc. Zwykle wynosi 5, ale może wynosić 4 (feb) lub 6 (1. jest niedziela i miesiąc ma 30-31 dni)

=========== AKTUALIZACJA:

Nadal nie jestem pewien, czy dostaniesz numer tygodnia, ale ponieważ odkryłem, że nie rozwiąże on mojego problemu z wyliczeniem, ile tygodni zajmuje miesiąc, porzuciłem go.

Oto funkcja, aby dowiedzieć się, jak wiele tygodni dokładnie miesiąc zajmują w kalendarzu:

getWeeksNum: function(year, month) { 
    var daysNum = 32 - new Date(year, month, 32).getDate(), 
     fDayO = new Date(year, month, 1).getDay(), 
     fDay = fDayO ? (fDayO - 1) : 6, 
     weeksNum = Math.ceil((daysNum + fDay)/7); 
    return weeksNum; 
} 
+0

Należy naprawdę napisać to samemu. To dość trywialne zadanie. Jestem pewien, że Google ma wiele odpowiedzi na temat tego, jak zdobyć lata przestępne. – Trevor

+2

Mogłem, ale wolę nie wymyślać koła, szczególnie dobrze przetestowane koło. – Max

+3

Moment.js to świetna biblioteka daty/czasu JS. Sprawdź dokumentację - http://momentjs.com/docs/ - ma opcję tygodnia w roku. Musisz zweryfikować, w jaki sposób obsługuje rok przestępny. Moje dotychczasowe doświadczenia z biblioteką były świetne. – ryanlahue

Odpowiedz

10
/** 
* Returns the week number for this date. dowOffset is the day of week the week 
* "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday), 
* the week returned is the ISO 8601 week number. 
* @param int dowOffset 
* @return int 
*/ 
Date.prototype.getWeek = function (dowOffset) { 
/*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.meanfreepath.com */ 

    dowOffset = typeof(dowOffset) == 'int' ? dowOffset : 0; //default dowOffset to zero 
    var newYear = new Date(this.getFullYear(),0,1); 
    var day = newYear.getDay() - dowOffset; //the day of week the year begins on 
    day = (day >= 0 ? day : day + 7); 
    var daynum = Math.floor((this.getTime() - newYear.getTime() - 
    (this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1; 
    var weeknum; 
    //if the year starts before the middle of a week 
    if(day < 4) { 
     weeknum = Math.floor((daynum+day-1)/7) + 1; 
     if(weeknum > 52) { 
      nYear = new Date(this.getFullYear() + 1,0,1); 
      nday = nYear.getDay() - dowOffset; 
      nday = nday >= 0 ? nday : nday + 7; 
      /*if the next year starts before the middle of 
       the week, it is week #1 of that year*/ 
      weeknum = nday < 4 ? 1 : 53; 
     } 
    } 
    else { 
     weeknum = Math.floor((daynum+day-1)/7); 
    } 
    return weeknum; 
}; 

Zastosowanie:

var mydate = new Date(2011,2,3); // month number starts from 0 
// or like this 
var mydate = new Date('March 3, 2011'); 
alert(mydate.getWeek()); 

Source

+0

Nie wydaje się, że to prawda, gdy porównałem wyniki za pomocą kodu z epochconverter.com.Zobacz ten Fiddle i porównaj swój tydzień 1, 2014 w porównaniu do pierwszego tygodnia Epochconverter. Jesteś wolny o jeden? http://jsfiddle.net/q96AM/2/ – mrtsherman

+0

Epochconverter pokazuje mi ten sam wynik - Tydzień 01 = 30 grudnia 2013. Może być wyłączony o jeden dzień, jeśli Twój tydzień rozpoczyna się w niedzielę. – Cheery

+1

Przepraszam, zapomniałem daty. Rok 2015 jest rokiem problemowym. W każdym razie, debugowałem problem. Numer dowOffset uruchamia 'typeof == 'int'', który powinien być' typeof ==' number''. Po wprowadzeniu zmiany działa zgodnie ze standardami ISO 8601. Aby zobaczyć problem, możesz edytować to skrzypce, aby użyć "int" zamiast "number", a zobaczysz, że rok 2014 ma 53 tygodnie, kiedy naprawdę powinien mieć 52. To powoduje, że cały rok 2015 jest wyłączony o tydzień. Problem powtarza się co dekadę (2025, 2035, n + 10) - http://jsfiddle.net/2PBcS/ – mrtsherman

2

Rozważ użycie moje wykonanie " Date.prototype.getWeek ", myślę, że jest dokładniejsza niż inne, które widziałem tutaj :)

Date.prototype.getWeek = function(){ 
    // We have to compare against the first monday of the year not the 01/01 
    // 60*60*24*1000 = 86400000 
    // 'onejan_next_monday_time' reffers to the miliseconds of the next monday after 01/01 

    var day_miliseconds = 86400000, 
     onejan = new Date(this.getFullYear(),0,1,0,0,0), 
     onejan_day = (onejan.getDay()==0) ? 7 : onejan.getDay(), 
     days_for_next_monday = (8-onejan_day), 
     onejan_next_monday_time = onejan.getTime() + (days_for_next_monday * day_miliseconds), 
     // If one jan is not a monday, get the first monday of the year 
     first_monday_year_time = (onejan_day>1) ? onejan_next_monday_time : onejan.getTime(), 
     this_date = new Date(this.getFullYear(), this.getMonth(),this.getDate(),0,0,0),// This at 00:00:00 
     this_time = this_date.getTime(), 
     days_from_first_monday = Math.round(((this_time - first_monday_year_time)/day_miliseconds)); 

    var first_monday_year = new Date(first_monday_year_time); 

    // We add 1 to "days_from_first_monday" because if "days_from_first_monday" is *7, 
    // then 7/7 = 1, and as we are 7 days from first monday, 
    // we should be in week number 2 instead of week number 1 (7/7=1) 
    // We consider week number as 52 when "days_from_first_monday" is lower than 0, 
    // that means the actual week started before the first monday so that means we are on the firsts 
    // days of the year (ex: we are on Friday 01/01, then "days_from_first_monday"=-3, 
    // so friday 01/01 is part of week number 52 from past year) 
    // "days_from_first_monday<=364" because (364+1)/7 == 52, if we are on day 365, then (365+1)/7 >= 52 (Math.ceil(366/7)=53) and thats wrong 

    return (days_from_first_monday>=0 && days_from_first_monday<364) ? Math.ceil((days_from_first_monday+1)/7) : 52; 
} 

Można sprawdzić moje repo publicznego tutaj https://bitbucket.org/agustinhaller/date.getweek (testy w zestawie)

+1

To nie jest zgodny z ISO 8601. Jeśli spojrzysz na tygodnie na rok 2015, powinno być 53 tygodnie, ale ta funkcja zwraca 52. Zobaczysz też, że wszystkie tygodnie są wyłączone o jeden na ten rok. http://jsfiddle.net/2PBcS/1/ – mrtsherman

1

Get tydzień Liczba

Date.prototype.getWeek = function() { 
    var dt = new Date(this.getFullYear(),0,1); 
    return Math.ceil((((this - dt)/86400000) + dt.getDay()+1)/7); 
}; 

var myDate = new Date(2013, 3, 25); // 2013, 25 April 

console.log(myDate.getWeek()); 
+0

Nie jestem pewien, czy to rozwiązanie jest dość dokładne. Oto skrzypce. Wydaje się, że nie wiadomo, co to jest ostatni tydzień i jaki jest pierwszy tydzień w danym roku. http://jsfiddle.net/q96AM/1/ – mrtsherman

0

Dla tych, którzy szukają prostszego pproach;

Date.prototype.getWeek = function() { 
    var onejan = new Date(this.getFullYear(),0,1); 
    var today = new Date(this.getFullYear(),this.getMonth(),this.getDate()); 
    var dayOfYear = ((today - onejan + 86400000)/86400000); 
    return Math.ceil(dayOfYear/7) 
}; 

użytku z:

var today = new Date(); 
var currentWeekNumber = today.getWeek(); 
console.log(currentWeekNumber); 
1

/*get the week number by following the norms of ISO 8601*/ 
 
function getWeek(dt){ 
 
\t var calc=function(o){ 
 
\t \t if(o.dtmin.getDay()!=1){ 
 
\t \t \t if(o.dtmin.getDay()<=4 && o.dtmin.getDay()!=0)o.w+=1; 
 
\t \t \t o.dtmin.setDate((o.dtmin.getDay()==0)? 2 : 1+(7-o.dtmin.getDay())+1); 
 
\t \t } 
 
\t \t o.w+=Math.ceil((((o.dtmax.getTime()-o.dtmin.getTime())/(24*60*60*1000))+1)/7); 
 
\t },getNbDaysInAMonth=function(year,month){ 
 
\t \t var nbdays=31; 
 
\t \t for(var i=0;i<=3;i++){ 
 
\t \t \t nbdays=nbdays-i; 
 
\t \t \t if((dtInst=new Date(year,month-1,nbdays)) && dtInst.getDate()==nbdays && (dtInst.getMonth()+1)==month && dtInst.getFullYear()==year) 
 
\t \t \t \t break; 
 
\t \t } 
 
\t \t return nbdays; 
 
\t }; 
 
\t if(dt.getMonth()+1==1 && dt.getDate()>=1 && dt.getDate()<=3 && (dt.getDay()>=5 || dt.getDay()==0)){ 
 
\t \t var pyData={"dtmin":new Date(dt.getFullYear()-1,0,1,0,0,0,0),"dtmax":new Date(dt.getFullYear()-1,11,getNbDaysInAMonth(dt.getFullYear()-1,12),0,0,0,0),"w":0}; 
 
\t \t calc(pyData); 
 
\t \t return pyData.w; 
 
\t }else{ 
 
\t \t var ayData={"dtmin":new Date(dt.getFullYear(),0,1,0,0,0,0),"dtmax":new Date(dt.getFullYear(),dt.getMonth(),dt.getDate(),0,0,0,0),"w":0}, 
 
\t \t \t nd12m=getNbDaysInAMonth(dt.getFullYear(),12); 
 
\t \t if(dt.getMonth()==12 && dt.getDay()!=0 && dt.getDay()<=3 && nd12m-dt.getDate()<=3-dt.getDay())ayData.w=1;else calc(ayData); 
 
\t \t return ayData.w; 
 
\t } 
 
} 
 
alert(getWeek(new Date(2017,01-1,01)));