十月的Javascript日

时间:2013-12-19 21:56:04

标签: javascript

我在计算兴趣日时有一个有趣的错误。我每天都会检查并查看它是哪一天(1到31)。现在我发现了一个问题:10月份,计数无法正常运行。这意味着第27位是第26位,或第29位是第28位。这是一个众所周知的问题吗? 也许问题出现在我的代码中,但是,因为它适用于另一个时期,似乎没问题。

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <script type="text/javascript">
        function berecheZinstage() {
            //eingabe von den Feldern holen
            var strVon = txtVonDatum.value;
            var strBis = txtBisDatum.value;
            //label um das Resultat anzuzeigen
            var resultatTage = document.getElementById("lblTage");
            var resultatZinsTage = document.getElementById("lblZinstage");
            //tag als Milisekunden
            var tagMs = 86400000;
            var monatCount;
            //Eingabeformat umwandeln für die Berechung
            strVon = strVon.replace(/-/g, "/");
            strBis = strBis.replace(/-/g, "/");
            var vonDatum = new Date(strVon);
            var bisDatum = new Date(strBis);
            var zinsTage = 0;
            if (bisDatum > vonDatum) {
                var totTage = bisDatum - vonDatum;
                var nDays = Math.round(totTage / (1000 * 60 * 60 * 24));

                var pruefMS = vonDatum.getTime();
                var startMS = vonDatum.getTime();
                var endeMS = bisDatum.getTime();
                var febCount = 0;
                var langCount = 0;
                var tage = 0;
                for (var i = 0; i < nDays; i++) {
                   pruefMS = pruefMS + tagMs;
                   var pruefDatum = new Date(pruefMS);
                    var pruefMonat = pruefDatum.getMonth();
                    var pruefJahr = pruefDatum.getFullYear();

                    var pruefTag = pruefDatum.getDate();

                    if (pruefTag == 1 && pruefDatum != startMS) {
                        if (pruefMonat == 2) {
                            var istSchaltjahr = new Date(pruefJahr, 1, 29).getMonth() == 1;
                            if (istSchaltjahr) {
                                tage++;
                            }
                            else {
                                tage = tage + 2;
                            }
                        }
                    }
                    if (pruefTag != 31) {
                        tage++;
                    }
                }
                resultatZinsTage.innerText = tage.toString();
                resultatTage.innerText = pruefTag;//nDays.toString();
            }
            else {
                resultatTage.innerText = "Bis Datum muss grösser sein als von Datum";
            }

        }

    </script>

    <title>Zinstage berechen</title>
</head>

<body>
    <table style="width:100%;">
        <tr>
            <td style="width:100px;"><input id="txtVonDatum" type="text" /></td>
            <td style="width:100px;"><input id="txtBisDatum" type="text" /></td>
            <td style="width:100px;"><button id="btnCalcDays" type="button" onclick="berecheZinstage();">Berechnen</button></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>Tage:</td>
            <td><label id="lblTage"></label></td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>Zinstage:</td>
            <td><label id="lblZinstage"></label></td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </table>
</body>
</html>

谢谢,Marlowe

2 个答案:

答案 0 :(得分:1)

我不明白这段代码试图实现什么,但问题是DST(夏令时)。

每天添加86400000毫安应该可以正常工作。但在使用DST(德国默认)的区域设置中,日期"2013/10/01 00:00:00" + 31*86400000的结果为"2013/10/31 23:00:00"

实际上,如果我们包含时区,那么"2013/10/01 00:00:00 GMT+0200" + 31*86400000将为"2013/10/31 23:00:00 GMT+0100",因此以UTC格式添加是正确的。

同样在3月份,结果日期为"2013/04/01 01:00:00",但我们没有看到错误,因为我们只计算天数。

执行此类操作时,请始终使用UTC以避免头痛:)

答案 1 :(得分:0)

现在是工作代码。有了foibs给出的提示,我已经建立了一个小小的黑客来计算兴趣日。

<script type="text/javascript">
    function calcInterestDays() {
        //get the values from the input fields
        var strFrom = document.getElementById("txtFromDate").value;
        var strTill = document.getElementById("txtTillDate").value;
       //format strings
        strFrom = strFrom.replace(/-/g, "/");
        strTill = strTill.replace(/-/g, "/");
        var fromDate = new Date(strFrom);
        var tillDate = new Date(strTill);
        var msDay = 86400000;
        var startMS = fromDate.getTime();
        var totDays = Math.round((tillDate - fromDate) / (1000 * 60 * 60 * 24));
        var totMs = startMS;
        var outputStr = "";
        var days = 0;
        for (var i = 0; i < totDays; i++) {
            totMs = totMs + msDay;               
            var checkDate = new Date(totMs);
            var splitDate = checkDate.toString().split(" ");
            if (splitDate[6] == "0200") {
                var calcDay = new Date(totMs);
            }
            else {
                var calcDay = new Date(totMs + 3600000);
            }

            if (calcDay.getDate() == 1 && totMs != startMS) {
                if (calcDay.getMonth() == 2) {
                    var istSchaltjahr = new Date(calcDay.getFullYear(), 1, 29).getMonth() == 1;
                    if (istSchaltjahr) {
                        days++;
                    }
                    else {
                        days = days + 2;
                    }
                }
            }
            if (calcDay.getDate() != 31) {
                days++;
            }

            outputStr = outputStr + "<br>" + calcDay;
        }            
        document.getElementById("lblTotDays").innerHTML = totDays;
        document.getElementById("lblInterestDays").innerHTML = days;
        document.getElementById("output").innerHTML = outputStr;
    }
</script>

感谢您的帮助。