Avatar billede mireigi Novice
03. december 2008 - 09:39 Der er 6 kommentarer og
1 løsning

Beregning af ugenummer

Hej eksperter,

jeg er i gang med at lave en kalender i javascript, og fandt nedenstående script til at beregne ugenummeret, men det returnerer ugenummer 53 som den sidste uge i år, men det er forkert.

Nogen der kan tage et hurtigt kig på koden og sige hvorfor?

Mvh.
Mireigi

[ CODE BEGINS ]

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;
};

[ CODE ENDS]
Avatar billede olebole Juniormester
03. december 2008 - 16:52 #1
Avatar billede mireigi Novice
03. december 2008 - 17:37 #2
Måske har jeg formuleret mig dårligt, men jeg skal bruge ugenummeret ud fra en dato, ikke den anden vej rundt.

Fandt dog selv en løsning på problemet. Det viser sig at:
typeof(dowOffset)
returnerer "number" og ikke "int" når jeg sender fx 1 med ind som parameter, hvor 1 indikerer at ugerne starter om mandagen (mod søndag som er amerikansk).

Men du skal da have tak for det hurtige svar :)
Avatar billede olebole Juniormester
03. december 2008 - 17:45 #3
"Måske har jeg formuleret mig dårligt, men jeg skal bruge ugenummeret ud fra en dato, ikke den anden vej rundt." >> Nej, jeg tror bare du skal læse, hvad jeg linkede til  ;o)

function getWeekNumber(nD, nM, nY) {
    var oTestDate = (typeof nY!="undefined" && typeof nM!="undefined" && typeof nD!="undefined") ? new Date(nY, nM-1, nD) : new Date();
    var oFirstDate = new Date(oTestDate.getFullYear(), 0, 1);
    return Math.ceil( (oTestDate.getTime()-oFirstDate.getTime())/(7*24*60*60*1000) );
}

var nWeek = getWeekNumber(27,09,2008);
alert(nWeek)

Det giver dig ugenummeret for den 27. september 2008  =)
Avatar billede olebole Juniormester
03. december 2008 - 17:47 #4
- og:

var nWeek = getWeekNumber();
alert(nWeek)

- giver dig ugenummeret, vi har idag
Avatar billede mireigi Novice
03. december 2008 - 17:56 #5
Indrømmer at jeg kun skimmede din besvarelse, så må have overset den der :)
Har ikke tid til at teste det lige nu da jeg ikke er på arbejde, men returnerer den også det korrekte ugenummer for fx 31-12-2008 eller 01-01-2009 og tager højde for dansk kontra amerikansk uge?

Og i så fald, kan du omskrive den til at extende Date objektet? Har ikke lyst til at skulle gøre dette hver gang jeg skal bruge ugenummeret:
var currentDate = new Date();
var weekNumber = getWeekNumber(currentDate.getDate(), currentDate.getMonth(), currentDate.getFullYear());
alert(weekNumber);

når

var currentDate = new Date();
var weekNumber = currentDate.getWeekNumber();
alert(weekNumber);

er betydeligt nemmere :)
Avatar billede olebole Juniormester
03. december 2008 - 18:07 #6
Ja, det er sikkert nemmere - men er jo samtidig noget helt andet. Jeg tror i det hele taget, du ville hjælpe dig selv ved at bruge lidt mere omhu og tid på at fordybe dig i det, du fortager dig  =)
Avatar billede mireigi Novice
05. december 2008 - 11:38 #7
Jeg fik jo den oprindelige til at virke, men det du linkede til kunne jeg sagtens bruge. Det hjalp mig til at finde start datoen for en bestemt uge, så du får pointene.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester