代码之家  ›  专栏  ›  技术社区  ›  TheOrdinaryGeek

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

  •  2
  • TheOrdinaryGeek  · 技术社区  · 7 年前

    我正在使用引导数据选取器,根据日期选择,我需要向用户显示一条消息。

    我从来没有用过 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 回复  |  直到 7 年前
        1
  •  1
  •   RobG    7 年前

    你需要小心日期算术,因为它是不对称的,因为不均匀的月份长度,所以你需要规则来处理它。例如,8月31日前6个月的确切日期是什么?

    回答之前,请考虑:

    1. 2月28日加上8月28日是6个月
    2. 3月1日加上6个月为9月1日。
    3. 那么6个月是什么时候 之前 8月29、30和31日?是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。

        2
  •  2
  •   Kishan Rajdev    7 年前

    改变你的 sixMonthBeforeNow 有了下面的代码,这应该是可行的。

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