【问题标题】:Get the difference in months between two dates in (mm/dd/yyyy) format using jquery使用jquery以(mm / dd / yyyy)格式获取两个日期之间的月差
【发布时间】:2016-04-26 12:00:23
【问题描述】:

我想检索用户使用引导日期选择器输入的两个日期之间的月份差异。除此之外,我还尝试将第二个值(date2)替换为用户单击计算按钮时的月份差异。尝试处理此问题时,我的代码似乎无法正常工作...

这是我目前所拥有的:

$('#clickMe').click(function() {
    var date1 = $('#firstPayDate');
    var date2 = $('#loanTrm');
    var timeDiff = Math.abs(date2.getTime() - date1.getTime());
    var diffMonths = Math.ceil(timeDiff / (1000 * 3600 * 24)); 
    date2.val(date2.val().replace(diffMonths));
});

这是我想要完成的图片演示:

我正在尝试获取这两个条目之间的差异(到期日 - 首次付款日期)

我试图在用户单击“计算”按钮后进行计算,月份的差异将替换为在到期日期中输入的值。

任何帮助将不胜感激!

【问题讨论】:

  • date2.val().replace(diffDays).replace() 上似乎没有提供替换字符串?
  • 我相信 date1 和 date2 只是 HTMLElement 的 jQuery 包装器。你为什么在这里期待一个 Date 对象?您能否提供您要完成的工作的 jsfiddle 示例?
  • 对于任何约会的东西我总是求助于momentjs.com
  • 那些是 jQuery 对象 ....不是日期对象
  • 可以创建stacksn-ps来演示吗?

标签: javascript jquery html date


【解决方案1】:

人类的日历不利于简单的数学计算——幸运的是,javascript 提供了一个 Date 对象,它为我们完成了大部分繁琐的工作。

这会将日期字符串转换为日期对象(掩盖输入字段内容的任何格式或验证问题。请注意,在您的特定情况下,由于您打算将 #loanTrm 的值替换为月份数日期,如果用户点击“计算”两次,这将中断;纠正这更多的是用户界面问题而不是编码问题,所以我暂时忽略它):

var date1 = new Date($('#firstPayDate').val());
var date2 = new Date($('#loanTrm').val());
var datediff = date2 - date1; 

(正如下面的 cmets 所指出的,还要注意 Date 使用用户的语言环境来确定预期的日期格式:如果您总是以 mm/dd/yy 显示日期,那么您可能不应该这样做,因为世界上大部分地区都使用 dd/mm/yy。您要么需要根据用户区域设置格式化输入字段,要么使用更明确的new Date(year, month, day, hours, minutes, seconds, milliseconds) 构建您的日期,而不是我上面显示的字符串快捷方式。 )(就像我说的:约会很难!等到您尝试时区,它们会更有趣)

datediff 现在包含两个日期之间的实际差异(以毫秒为单位)。

接下来会发生什么取决于您所说的“月差”的确切含义,因为月的长度并不总是相同的。

如果您不关心精度,您可以通过假设每个月有 30 天并将datediff 除以 (1000*60*60*24*30) 来获得可能足够接近的近似值。如果您确实关心精度,那么您已经走出了自己的领域,并且可能应该使用专门用于此类数学的库之一(momentjs 是一个很好的库。)

(还有许多其他 SO 问题涉及这类事情;其中任何一个取决于字符串匹配而不是 Date() 的答案至少每四年会出错一次,而且可能更常见.)

【讨论】:

  • 每 4 年才出现一次的问题是一个非常有趣 的问题,可以尝试解决。如果讽刺不够厚实,那真是真的有趣的问题。
  • 如果日期总是以 mm/dd/yyyy 打印,那么对于使用不同格式的语言环境的用户,new Date() 肯定会失败。
【解决方案2】:

尝试抹去你的价值

date2.val();  

然后将值分配给您的输入。

date2.val(diffMonths);

【讨论】:

    【解决方案3】:

    试试这个。您可以在代码 sn-p 中查看月份的差异。

      $(function() {
    // you can change the format to the way you want
    
                            $( "#datepicker1" ).datepicker({
                                yearRange: "-20:+100",
                                changeMonth: true,
                                changeYear: true,
                                dateFormat: "d-M-y"
                            });
                    
    
    
                            $( "#datepicker2" ).datepicker({
                                yearRange: "-20:+100",
                                changeMonth: true,
                                changeYear: true,
                                dateFormat: "d-M-y"
                            });
    });
    
    
    function monthDiff(d1, d2) {
        var months;
        months = (d2.getFullYear() - d1.getFullYear()) * 12;
        months -= d1.getMonth();
        months += d2.getMonth();
        return months <= 0 ? 0 : months;
    }
    
    function cal() {
    d1 = new Date($( "#datepicker1" ).val());
    d2 = new Date($( "#datepicker2").val());
    alert("The difference between two dates is: " +monthDiff(d1, d2));
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
    <p>Date1: <input type="text" id="datepicker1"></p>
    <p>Date2: <input type="text" id="datepicker2"></p>
    <button id="calculate" onclick="cal()"> Calculate </button>

    【讨论】:

      【解决方案4】:

      以下逻辑会在几个月内有所不同

      (endDate.getFullYear()*12+endDate.getMonth())-(startDate.getFullYear()*12+startDate.getMonth())
      

      【讨论】:

      • 这有助于计算捐赠表格上的每月分期付款(基于开始/结束日期)。谢谢!
      猜你喜欢
      • 2019-03-11
      • 2020-04-16
      • 1970-01-01
      • 2011-03-12
      • 2017-04-07
      • 2011-09-09
      • 2023-02-24
      • 2022-07-20
      • 2016-01-02
      相关资源
      最近更新 更多