JavaScript日期计算返回不正确的值

时间:2019-07-16 00:41:45

标签: javascript jquery

我有一个javascript日期计算器,该计算器有时有效,有时却无效。我已经阅读了How do I get the number of days between two dates in JavaScript?,但是我不确定在哪里实施任何建议,因为在我看来,此帖子的日期是在代码内部而不是通过输入预先确定的。

例如,如果输入日期为2019年10月1日,您将得到以下结果:

45天:2019年11月14日,星期四

180天:2020年3月29日,星期日

但是,如果输入日期为2019年12月1日,则会得到以下结果:

45天:2020年1月15日,星期三

180天:2020年5月29日,星期五

这是不正确的,因为12月有31天。 31 + 15 = 46?大多数月份都会发生某种错误的计算。

(function ($) {
    var weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];

    var afterTime = function (time, days) {
        time = time + (24 * 60 * 60 * 1000) * days;
        return time;
    };

    var getDate = function () {
        var yy = $('input#year').val();
        var mm = $('select#month').val();
        var dd = $('input#day').val();
        var wd;

        if (yy.trim().length === 0 || mm.trim().length === 0 || dd.trim().length === 0) {
            return;
        }

        var startDate = new Date(yy, mm, dd);
        var resultDate;

        resultDate = new Date();
        resultDate.setTime(afterTime(startDate.getTime(), 45));
        yy = resultDate.getFullYear();
        mm = resultDate.getMonth();
        dd = resultDate.getDate();
        wd = resultDate.getDay();
        $('#dateAfter45').html('<span>Your 45 Days from now ends on:</span> ' + weekdays[wd] + ', ' + months[mm] + ' ' + dd + ', ' + yy);

        resultDate = new Date();
        resultDate.setTime(afterTime(startDate.getTime(), 180));
        yy = resultDate.getFullYear();
        mm = resultDate.getMonth();
        dd = resultDate.getDate();
        wd = resultDate.getDay();
        $('#dateAfter180').html('<span>Your 180 Days from now ends on:</span> ' + weekdays[wd] + ', ' + months[mm] + ' ' + dd + ', ' + yy);
    };

    $(document).ready(function () {
        $('input#year').change(function () {
            getDate();
        });
        $('input#day').change(function () {
            getDate();
        });
        $('select#month').change(function () {
            getDate();
        });
    });

})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="dateselector">
            <div class="start-date">
                <form class="form">
                    <div class="form-row align-items-center">
                        <div class="col-auto">
                            <!--label for="month">Month</label-->
                            <select name="month" id="month" class="form-control">
                                <option value="" disabled selected>- Select a Month -</option>
                                <option value="0">January</option>
                                <option value="1">February</option>
                                <option value="2">March</option>
                                <option value="3">April</option>
                                <option value="4">May</option>
                                <option value="5">June</option>
                                <option value="6">July</option>
                                <option value="7">August</option>
                                <option value="8">September</option>
                                <option value="9">October</option>
                                <option value="10">November</option>
                                <option value="11">December</option>
                            </select>
                        </div>
                        <div class="col-auto">
                            <!--label for="day">Day</label-->
                            <input type="text" name="day" id="day" class="form-control" placeholder="Day" maxlength="2">
                        </div>
                        <div class="col-auto">
                            <!--label for="day">Year</label-->
                            <input type="text" name="year" id="year" class="form-control" placeholder="Year" maxlength="4">
                        </div>
                        <div class="col-auto">
                            <!--label for="day">Year</label-->
                            <span class="butn hvr-sweep-to-top">Calculate</span>
                        </div>
                    </div>
                </form>
            </div>
            <div class="result-date">
                <h4 id="dateAfter45"></h4>
                <h4 id="dateAfter180"></h4>
            </div>
        </div>

2 个答案:

答案 0 :(得分:1)

45是31 +14。12月1日是1月1日之后的31天,1月1日是1月15日之后的14天。

结果正确。跨月边界的日期算术偏离1,因为月份中没有第0天。

在第一种情况下,您将获得11月14日的原因是因为夏令时在10月的某个时候发生了变化。您的afterTime()函数将整天视为24小时,但是DST结束后,我们会在这一天增加一个小时。因此,您将从Oct 1 00:00:00转到Nov 14 23:00:00,而不是Nov 15 00:00:00

使用Date类中的内置日期算术,它会为此自动进行调整。

resultDate.setTime(afterTime(startDate.getTime(), 45));

答案 1 :(得分:0)

这是我为平日和月的简短计算而制作的示例,希望对您有所帮助

Date.prototype.calculateDays = function(days) {
   var date = new Date(this.valueOf());
   //here you can enter the date you picked
   date.setDate(date.getDate() + days);
   return date;
}

var options = {
          weekday: 'long',
          year: 'numeric',
          month: 'long',
          day: 'numeric'
        };
        
let resultDate = new Date();
let firstDate = resultDate.calculateDays(45).toLocaleDateString('en-US', options);
console.log(firstDate);
        
let secondDate = resultDate.calculateDays(180).toLocaleDateString('en-US', options);
console.log(secondDate);