Avatar billede lsskaarup Nybegynder
21. september 2006 - 15:54 Der er 7 kommentarer og
1 løsning

Hjælp til kalender script

Jeg skal have hjælp til at lave et script, der kan fraregne weekender, helligdage og faste ferier.

Jeg har et felt (r533) der indtastes en endelig deadline i.
Der skal nu regnes 3 mellem deadlines, baglæns ud fra felt r533.
Felterne til deadlines er følgende, r533, r532, r531 og r530.
Felterne der bestemmer dagene imellem deadlines er r533a, r532a og r531a.
Jeg har ikke helt bestemt mig for hvordan ferien skal defineres, men den skal kunne ændres af en administrator, på en anden side.

Der er altså effektive arbejdsdage, der skal være imellem de forskellige deadlines, derfor skal den automatisk springe over weekender, helligdage og ferier.
Avatar billede roenving Novice
22. september 2006 - 00:20 #1
Noget af en opgave ...

-- for det første skal du jo have fod på helligdage og ferier, før du starter beregningerne, så de skal være til rådighed for scriptet på siden ...

-- derefter skal du sørge for, at eventuelle sammenfald imellem almindelige weekend-dage og disse ikke betyder, at der fratrækkes for lidt eller for mange dage ...

-- og så skal du sikre at dine start- og slut-beregninger dur uanset ugedage ...

-- selvfølgelig skal du også lige have fod på at disse er valide ...

-- afhængig af dine grunddata kan det vise sig at være nemmest at steppe en dag frem ad gangen og så inkrementere en tæller, hvis ikke dagen er indeholdt i de uduelige dage ...

-- men forhåbentlig kan du finde ud af det med en hurtigere algoritme ...

-- men ellers er det nok ikke et tidsmæssigt problem at gøre det langsomt, jeg vil gætte på, at det aldrig vil komme op på at tage mere end en tiendedel sekund selvom du skal beregne 200 arbejdsdage, og du har 200 helligdage liggende i et array, der skal gennemsøges for hver dag !-)
Avatar billede lsskaarup Nybegynder
22. september 2006 - 12:24 #2
Jeg har nu selv lavet noget, som tager højde for weekender og helligdag, troede jeg for da jeg skulle teste det virkede det 2006 men ikke 2005...

Noget af koden skal tilpasset, da jeg laver nogle krumspring, men det bliver efter jeg har fået det til at virke.

Men hvorfor tæller den ikke helligdagene i 2005 med?

Derudover mangler jeg så de faste ferier.

            //Find dato til felt 532
            for (maanedsdage = 1; maanedsdage <= arbejdsdage; maanedsdage++){
                originalt = (Date.parse(original));//parse til millisekunder
                var udregnDag = originalt - (maanedsdage*24*60*60*1000); //udregne den nye dag
                //alert(originalt);

                var nydag_532 = new Date();//til skabelse af den nye dag

                var tmpDag = nydag_532.setTime(udregnDag);//Ellers kan jeg ikke sat tiden, men hvorfor er den nødvendig?
                midDag_531 = tmpDag;//dag fra 1-1-1970
               
                var mid = nydag_532.getDay();//Finder ugedagsnummeret, søndag -> lørdøg, 0 -> 6

var paaskedag2 = Date.parse( easter(nydag_532.getFullYear()) ) + dage(1);
var skaertorsdag = Date.parse( easter(nydag_532.getFullYear()) ) - dage(3);
var langfredag = Date.parse( easter(nydag_532.getFullYear()) ) - dage(2);
var kristi = Date.parse( easter(nydag_532.getFullYear()) ) + dage(39);
var pinsedag2 = Date.parse( easter(nydag_532.getFullYear()) ) + dage(50);


                    //alert(pinsedag2);

                if (tmpDag == paaskedag2 || tmpDag == skaertorsdag || tmpDag == langfredag || tmpDag == kristi || tmpDag == pinsedag2){

                    arbejdsdage = arbejdsdage + 1;
                } else if(mid == 6 || mid == 0){
                    arbejdsdage = arbejdsdage + 1;
                }

            }

            ds.r532.value = missingZero(nydag_532.getDate()) + '-' + missingZero((nydag_532.getMonth()+1)) + '-' + nydag_532.getFullYear();
Avatar billede lsskaarup Nybegynder
22. september 2006 - 13:52 #3
Hmm, jeg kan se er den omkring påskesøndag d. 28/3/2005 pludselig skifter tidszone. Før den dag regnes der i UTC+2 kl. 00.00, derefter UTC+1 kl. 23.00. Samtidig hvis jeg beder den om at udskrive datoerne, så springer den over 28/3
Avatar billede lsskaarup Nybegynder
22. september 2006 - 13:52 #4
Sludder, den var den 27. i stedet for den 28.
Avatar billede lsskaarup Nybegynder
22. september 2006 - 14:23 #5
Nå der er et eller andet med tidszonerne omkring sommertid start, måske også slut, som jeg ikke lige kan gennemskue. Derfor har jeg ændret koden så den ikke køre på millisekunder, men på dato i stedet.

            //Find dato til felt 532
            for (maanedsdage = 1; maanedsdage <= arbejdsdage; maanedsdage++){
                //alert(maanedsdage + " " + arbejdsdage);
                originalt = (Date.parse(original));//parse til millisekunder
                var udregnDag = originalt - (maanedsdage*24*60*60*1000); //udregne den nye dag
                //alert(originalt);

                var nydag_532 = new Date();//til skabelse af den nye dag

                var tmpDag = nydag_532.setTime(udregnDag);//Ellers kan jeg ikke sat tiden, men hvorfor er den nødvendig?
                midDag_531 = tmpDag;//dag fra 1-1-1970
               
                var mid = nydag_532.getDay();//Finder ugedagsnummeret, søndag -> lørdøg, 0 -> 6


var paaskedag2 = new Date();
paaskedag2.setTime( Date.parse( easter(nydag_532.getFullYear()) ) + dage(1) );
var paa = missingZero(paaskedag2.getDate()) + '-' + missingZero((paaskedag2.getMonth()+1)) + '-' + paaskedag2.getFullYear();

var skaertorsdag = new Date();
skaertorsdag.setTime( Date.parse( easter(nydag_532.getFullYear()) ) - dage(3) );
var skaer = missingZero(skaertorsdag.getDate()) + '-' + missingZero((skaertorsdag.getMonth()+1)) + '-' + skaertorsdag.getFullYear();

var langfredag = new Date();
langfredag.setTime( Date.parse( easter(nydag_532.getFullYear()) ) - dage(2) );
var lang = missingZero(langfredag.getDate()) + '-' + missingZero((langfredag.getMonth()+1)) + '-' + langfredag.getFullYear();

var kristi = new Date();
kristi.setTime( Date.parse( easter(nydag_532.getFullYear()) ) + dage(39) );
var kri = missingZero(kristi.getDate()) + '-' + missingZero((kristi.getMonth()+1)) + '-' + kristi.getFullYear();

var pinsedag2 = new Date();
pinsedag2.setTime( Date.parse( easter(nydag_532.getFullYear()) ) + dage(50) );
var pins = missingZero(pinsedag2.getDate()) + '-' + missingZero((pinsedag2.getMonth()+1)) + '-' + pinsedag2.getFullYear();


                var test3 = new Date();
                test3.setTime(nydag_532);
                var test3_1 = missingZero(test3.getDate()) + '-' + missingZero((test3.getMonth()+1)) + '-' + test3.getFullYear()

                if(test3_1 == paa || test3_1 == skaer || test3_1 == lang || test3_1 == kri || test3_1 == pins ) {
                    arbejdsdage = arbejdsdage + 1;
                } else if(mid == 6 || mid == 0){
                    arbejdsdage = arbejdsdage + 1;
                }

            }

            ds.r532.value = missingZero(nydag_532.getDate()) + '-' + missingZero((nydag_532.getMonth()+1)) + '-' + nydag_532.getFullYear();
Avatar billede lsskaarup Nybegynder
25. september 2006 - 11:12 #6
Jeg har nu også fået lavet så systemet springer over faste datoer. Disse skal indtastes i en administrationsdel af systemet, og gemmes i en db.
Avatar billede roenving Novice
25. september 2006 - 23:09 #7
Zq da godt, at du er kommet videre, jeg regner med at have en smule tid i morgen !-)
Avatar billede lsskaarup Nybegynder
26. september 2006 - 11:53 #8
Jeg tror ikke det bliver nødvendigt, men tak.
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