JS检查日期在今天的6个月内



我正在使用Bootstrap Datepicker,根据日期选择,我需要向用户显示一条消息。

我以前从未使用过日期构造函数,所以它对我来说很新。

我需要做的是以下内容;

  • 允许用户选择日期
  • 根据以下逻辑显示消息/警报

如果他们选择的日期在今天的最后 6 个月内,他们就可以享受折扣。 如果他们选择的日期不在今天的最后 6 个月内,则他们不会。

虽然它不能正常工作,但在这里创建了一个小提琴。

任何帮助将不胜感激。代码也在下面;

.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库/插件。

只需使用以下代码更改sixMonthBeforeNow,这应该可以工作。

var sixMonthBeforeNow = new Date(now).setMonth(now.getMonth() - 6);

您需要小心日期算术,因为由于月份的长度不均匀,它不是对称的,因此您需要规则来处理它。 例如,8 月 31 日之前的 6 个月正好是哪一天?

在回答之前,请考虑:

2月28日
  1. 加6个月是8月28日
  2. 3 月 1
  3. 日加上 6 个月是 9 月 1 日。
  4. 那么8月29日、30日和31日之前的6个月是哪一天呢?是2月28日还是3月1日?

在 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))));

如果这不是您希望应用的逻辑,您需要说出是什么。

附言。您还可以通过比较开始日期和结束日期(日期数(来实现上述逻辑。如果它们不同,则它必须滚动一个月,因此设置为 0。

相关内容

最新更新