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

时间:2018-05-22 16:04:43

标签: javascript jquery date

我正在使用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库/插件。

2 个答案:

答案 0 :(得分:2)

只需使用以下代码更改您的sixMonthBeforeNow即可。

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

答案 1 :(得分:1)

你需要注意日期算术,因为它由于月份长度不均匀而不对称,所以你需要规则来处理它。例如。什么日期恰好是8月31日前的6个月?

在回答之前,请考虑:

  1. 2月28日加6个月是8月28日
  2. 3月1日加6个月是9月1日。
  3. 那么在 8月29日,30日和31日之前的6个月是什么日期?是2月28日还是3月1日?
  4. 类似的问题出现在一个月的最后一天,其中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。