Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 两个日期之间的差异_Javascript_Date - Fatal编程技术网

Javascript 两个日期之间的差异

Javascript 两个日期之间的差异,javascript,date,Javascript,Date,我必须简单地计算两个日期之间的差异,并将其显示为整数,但如果两个日期之间有大量日期(超过26个),以及两个日期之间有一个月的“31日”,我下面的代码就会给出错误 找不到我的代码有什么问题 'ires_sakuma_datums'和'ires_beigu_datums'的值由jquery日历选择器设置,并分别以25-08-2012和17-09-2012等格式显示,结果应显示在id'dienu skaits' 示例'ires_sakuma_datums'设置为28-08-2012,'ires_bei

我必须简单地计算两个日期之间的差异,并将其显示为整数,但如果两个日期之间有大量日期(超过26个),以及两个日期之间有一个月的“31日”,我下面的代码就会给出错误

找不到我的代码有什么问题

'ires_sakuma_datums'
'ires_beigu_datums'
的值由jquery日历选择器设置,并分别以
25-08-2012
17-09-2012
等格式显示,结果应显示在id
'dienu skaits'

示例
'ires_sakuma_datums'
设置为
28-08-2012
'ires_beigu_datums'
设置为
29-09-2012
,结果是
31.04166666668
,尽管我预计结果是
32

   function getDays()
    {
        var x = document.getElementById('ires_sakuma_datums').value;
        var y = document.getElementById('ires_beigu_datums').value;

        //assuming that the delimiter for dt time picker is a '-'.
        var arr1 = x.split('-');
        var arr2 = y.split('-');
        var dt1 = new Date();
        dt1.setFullYear(arr1[2], arr1[1], arr1[0]);
        var dt2 = new Date();
        dt2.setFullYear(arr2[2], arr2[1], arr2[0]);

        document.getElementById('dienu_skaits').value = (dt2.valueOf() - dt1.valueOf()) / (60 * 60 * 24 * 1000);

document.forms['test'].elements['dienu_skaits'].focus();
    }

问题是传递到
Date
的月份是以0为基础的,因此必须从月份中减去1。因此,您对
28-08-2012
29-09-2012
之间的比较实际上是不同的
28-09-2012
29-10-2012

因此,您的代码需要更改为

    var arr1 = x.split('-');
    var arr2 = y.split('-');
    var dt1 = new Date();
    dt1.setFullYear(arr1[2], parseInt(arr1[1],10) -1, arr1[0]);
    var dt2 = new Date();
    dt2.setFullYear(arr2[2], parseInt(arr2[1],10) - 1, arr2[0]);
请注意,如果您的日期超过夏令时,则两者之间的天数将不相等,因此您需要对结果进行四舍五入

document.getElementById('dienu_skaits').value = Math.round( 
    (dt2 - dt1) / (60 * 60 * 24 * 1000) 
);

我强烈建议在JavaScript中使用DateJs或MomentJs进行日期操作。@编辑和批准人:看不到jQuery,添加jQuery和jQuery UI标记很奇怪。如果您删除对DOM的引用,并专注于日期部分,则示例代码会更好,噪音更小,数据来自何处无关。始终尝试创建只包含相关代码的简化。您还应指定您看到的错误。@raivis请编辑问题,并提供预期结果和实际结果,不要将其添加为注释……我只是检查您的建议,但如果我将其设置为
23-08-2012
28-10-2012
之间,则结果将变为
66.041666666667
不知道它为什么会变成这样的数字…?@raivis,如果您使用您给出的两个日期,则这是不正确的(
23-08-2012
28-10-2012
),您将在这两个时间间隔内获得66天,请参见。如果您跨越夏令时更改,您将获得截断的数字。例如,如果您区分
23-08-2012
28-11-2012
,您将获得
-97.041666666666666667
,这是自时间更改以来您所期望的结果(至少在美国,夏时制将于2012-11-04结束)。@raivis,事实上,如果你所在的地方遵循欧盟夏时制,那么你给出的日期会发生跨夏时制的变化,这就是为什么数字不相等。你可以(大致)解释这一点通过使用
Math.round
Thank Juan!我还认为这是因为夏令时。