我有一个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>
答案 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);