我正在使用Bootstrap Datepicker,并根据日期选择我需要向用户显示一条消息。
我之前从未使用过Date Constructor,所以对我来说这是一个新手。
我需要做的是以下内容;
如果他们选择的日期在今天的最后6个月内,他们的质量可以打折。 如果他们选择的日期不在今天的最后6个月内,他们就不会。
虽然它无法正常工作但创建了fiddle here。
任何帮助将不胜感激。代码也在下面;
HTML
<input type="text" class="form-control" id="datepicker" placeholder="Year Graduated" value="" data-date-format="dd/mm/yyyy">
<p id="rate"></p>
JS
function compareDate() {
// get date from datepicker
var dateEntered = $("#datepicker").datepicker("getDate");
dateEntered = new Date(dateEntered).getTime();
//alert("date entered: " + dateEntered);
// set todays date
var now = new Date();
// set date six months before today
var sixMonthBeforeNow = new Date(now).setTime(now.getTime() - 3 * 28 * 24 * 60 * 60);
//alert("six months before: " + sixMonthBeforeNow);
// if date entered is within six months from today
if (dateEntered > sixMonthBeforeNow) {
alert("You qualify for the discount rate.");
$("#rate").html('discount rate');
}
// if date entered is over six months from today
if (dateEntered < sixMonthBeforeNow) {
alert("you graduated more than six months ago");
$("#rate").html('no discount');
}
}
$("#datepicker").datepicker({
weekStart: 1,
daysOfWeekHighlighted: "6,0",
autoclose: true,
todayHighlight: true
});
$("#datepicker").change(function() {
compareDate();
});
注意:我不想使用任何其他第三方JS库/插件。
答案 0 :(得分:2)
只需使用以下代码更改您的sixMonthBeforeNow
即可。
var sixMonthBeforeNow = new Date(now).setMonth(now.getMonth() - 6);
答案 1 :(得分:1)
你需要注意日期算术,因为它由于月份长度不均匀而不对称,所以你需要规则来处理它。例如。什么日期恰好是8月31日前的6个月?
在回答之前,请考虑:
类似的问题出现在一个月的最后一天,其中6个月前的月份没有31天。该限制应该是该月的30日还是下个月的第1日?当你回答了这个问题后,你可以设计一个算法来提供正确的答案,然后设计代码来实现它。
如果您希望此类案例将日期设置为6个月之前的月末,那么您可以检查减去6个月所得的月份,如果不是6,则将其设置为上个月的最后一天,例如
function sixMonthsPrior(date) {
// Copy date so don't affect original
var d = new Date(date);
// Get the current month number
var m = d.getMonth();
// Subtract 6 months
d.setMonth(d.getMonth() - 6);
// If the new month number isn't m - 6, set to last day of previous month
// Allow for cases where m < 6
var diff = (m + 12 - d.getMonth()) % 12;
if (diff < 6) d.setDate(0)
return d;
}
// Helper to format the date
function formatDate(d) {
return d.toLocaleString(undefined, {day:'2-digit', month:'short', year:'numeric'});
}
// Tests
[ new Date(2018, 7,31), // 31 Aug 2018
new Date(2018, 8, 1), // 1 Sep 2018
new Date(2018,11,31), // 31 Dec 2018
new Date(2019, 2,31) // 31 Mar 2019
].forEach( d => console.log(formatDate(d) + ' => ' + formatDate(sixMonthsPrior(d))));
如果这不是你想要应用的逻辑,你需要说明是什么。
PS。您还可以通过比较开始和结束日期(日期编号)来实现上述逻辑。如果它们不同,则必须滚动一个月,因此设置为0。