Avatar billede lsskaarup Nybegynder
27. juni 2006 - 16:28 Der er 1 kommentar og
1 løsning

Springe over bestemte datoer

Jeg har en funktion, der udregner 3 (532, 531, 530) nye datoer ud fra en oprindelsesdato (533). De ligger med et fast interval imellem sig, men tager ikke højde for ferie/helligdage samt weekender.

Dette skal jeg have hjælp til at lave.

Jeg har lavet en administratordel, hvor der kan indtastes nogle datoer, som der skal springes over, f.eks. helligdage.

Funktionen som der ser ud nu:

function performBeregn() {
var kalender = new Array();

<?php
    $kalender = array();
    $query = "SELECT * FROM kalender ORDER BY dato DESC";
    $sql = mysql_query($query) or die(mysql_error);
    while ($foo = mysql_fetch_array($sql)){
        $kalender[$foo['id']]= sqltoalmdate($foo['dato']);

?>

        kalender[<?php echo $foo['id'];?>] = new String('<?php echo sqltoalmdate($foo['dato']);?>');

<?    }
?>
//alert(String(kalender[1]));
//alert('<?php echo sizeof($kalender);?>');

        for (i=0; i<ds.length; i++) {
            if (ds[i].type == "text") ds[i].value = ds[i].value.replace(',', '.');
        }

        var s = ds.r533.value;

        if (ds.r533.value != ""){ //Hvis dato ikke er tom udregn de andre datoer, mangler tjek for tekst
            var dateArray = s.split('-');

            sdate = new Date(takeYear(dateArray[2]),dateArray[1]-1,dateArray[0]);
       
            var adate = new Date(sdate.getTime() - (readVal(ds.r533a.value) * 86400000));
            var bdate = new Date(sdate.getTime() - ((readVal(ds.r533a.value)+readVal(ds.r532a.value)) * 86400000));
            var cdate = new Date(sdate.getTime() - ((readVal(ds.r533a.value)+readVal(ds.r532a.value)+readVal(ds.r531a.value)) * 86400000));

            ds.r533.value = missingZero(sdate.getDate()) + '-' + missingZero((sdate.getMonth()+1)) + '-' + sdate.getFullYear();

            ds.r532.value = missingZero(adate.getDate()) + '-' + missingZero((adate.getMonth()+1)) + '-' + adate.getFullYear();
            ds.r531.value = missingZero(bdate.getDate()) + '-' + missingZero((bdate.getMonth()+1)) + '-' + bdate.getFullYear();
            ds.r530.value = missingZero(cdate.getDate()) + '-' + missingZero((cdate.getMonth()+1)) + '-' + cdate.getFullYear();

            ds.r533b.value = getWeekNumber(sdate);
            //ds.r533b.value;

            //konvertering af dato til sqldato
            var dato = s.split('-');
            ds.r533c.value = dato[2] + "-" + dato[1] + "-" + dato[0];
       
            return false;
        }
    }

Datoen 532 ligger altså f.eks. 28 dage før end 533, og der skal altså laves så weekender og forbudte datoer (helligdage og ferier) ikke regnes med, så det skal altså være 28 arbejdsdage og ikke kalenderdage.
Avatar billede lsskaarup Nybegynder
28. juni 2006 - 17:06 #1
Jeg tro nu lavet jeg har fået det lavet, så den "springer" over weekenderne, men der er noget jeg ikke helt forstår.

Jeg har sat den til at alerts, for at tjekke om det sker rigtigt, og jeg kan se den ikke tæller søndag den 26 marts i år med, men når jeg beregner den nye dato (arbejdsdag uden weekender), så lander jeg godt nok på den rigtige dato, det undre mig noget.

Måske er der nogen som kan forklare hvorfor det lykkedes. Derudover er der også en anden ting i koden jeg ikke forstår, men det kan ses ud af min kommatering i koden.

//test af datoberegning
            var original = new Date();
            original = missingZero(sdate.getDate()) + '-' + missingZero((sdate.getMonth()+1)) + '-' + sdate.getFullYear();
            var arbejdsdage = ds.r533a.value;
            var maanedsdage = parseInt(arbejdsdage);
            var endeligeMaanedsdage = parseInt(arbejdsdage);

            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

                var nydag = new Date();//til skabelse af den nye dag
                var tmpDag = nydag.setTime(udregnDag);//Ellers kan jeg ikke sat tiden, men hvorfor er den nødvendig?

                var mid = nydag.getDay();//Finder ugedagsnummeret, søndag -> lørdøg, 0 -> 6

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


                alert(nydag);
                alert(endeligeMaanedsdage);


            }

            var rigtigeDag = originalt - (endeligeMaanedsdage*24*60*60*1000); //udregne den nye dag
            var rigDag = new Date();
            var rgDag = rigDag.setTime(rigtigeDag)
            alert(rigDag);
Avatar billede lsskaarup Nybegynder
20. juli 2006 - 13:04 #2
Nå jeg prøver at oprette et nyt spørgsmål
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