为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取JavaScript中两个日期之间的天数?

如何获取JavaScript中两个日期之间的天数?

翻阅古今 2019-05-28 17:14:59
如何获取JavaScript中两个日期之间的天数?如何获取JavaScript中两个日期之间的天数?例如,在输入框中给出两个日期:<input id="first" value="1/1/2000"/><input id="second" value="1/1/2001"/><script>   alert(datediff("day", first, second)); // what goes here?</script>
查看完整描述

4 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

在撰写本文时,只有其中一个答案正确处理DST(夏令时)转换。以下是位于加利福尼亚州的系统的结果:


                                        1/1/2013- 3/10/2013- 11/3/2013-

User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result

---------  ---------------------------  --------  ---------  ---------  ---------

Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect

some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect

fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct

toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect


N = 86400000

虽然Math.round返回了正确的结果,但我认为它有些笨重。相反,通过在DST开始或结束时明确说明UTC偏移的变化,我们可以使用精确算术:


function treatAsUTC(date) {

    var result = new Date(date);

    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());

    return result;

}


function daysBetween(startDate, endDate) {

    var millisecondsPerDay = 24 * 60 * 60 * 1000;

    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;

}


alert(daysBetween($('#first').val(), $('#second').val()));

说明

JavaScript日期计算很棘手,因为Date对象在UTC内部存储时间,而不是本地时间。例如,3/10/2013 12:00 AM太平洋标准时间(UTC-08:00)存储为3/10/2013 8:00 AM UTC和3/11/2013 12:00 AM Pacific Daylight Time( UTC-07:00)存储为3/11/2013 7:00 AM UTC。在这一天午夜到午夜当地时间只有23小时在UTC!


虽然当地时间的一天可能有多于或少于24小时,但UTC的一天总是正好24小时。1daysBetween上面显示的方法利用了这一事实,首先要求treatAsUTC在减去和分割之前调整本地时间到午夜UTC。


查看完整回答
反对 回复 2019-05-28
?
暮色呼如

TA贡献1853条经验 获得超9个赞

获得两个日期之间差异的最简单方法:


var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

您可以获得差异天数(如果无法解析其中一个或两个,则为NaN)。解析日期以毫秒为单位给出结果,并且按天划分它需要将其除以24 * 60 * 60 * 1000


如果你想要它除以天,小时,分钟,秒和毫秒:


function dateDiff( str1, str2 ) {

    var diff = Date.parse( str2 ) - Date.parse( str1 ); 

    return isNaN( diff ) ? NaN : {

        diff : diff,

        ms : Math.floor( diff            % 1000 ),

        s  : Math.floor( diff /     1000 %   60 ),

        m  : Math.floor( diff /    60000 %   60 ),

        h  : Math.floor( diff /  3600000 %   24 ),

        d  : Math.floor( diff / 86400000        )

    };

}

这是我的重构版James版本:


function mydiff(date1,date2,interval) {

    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;

    date1 = new Date(date1);

    date2 = new Date(date2);

    var timediff = date2 - date1;

    if (isNaN(timediff)) return NaN;

    switch (interval) {

        case "years": return date2.getFullYear() - date1.getFullYear();

        case "months": return (

            ( date2.getFullYear() * 12 + date2.getMonth() )

            -

            ( date1.getFullYear() * 12 + date1.getMonth() )

        );

        case "weeks"  : return Math.floor(timediff / week);

        case "days"   : return Math.floor(timediff / day); 

        case "hours"  : return Math.floor(timediff / hour); 

        case "minutes": return Math.floor(timediff / minute);

        case "seconds": return Math.floor(timediff / second);

        default: return undefined;

    }

}


查看完整回答
反对 回复 2019-05-28
  • 4 回答
  • 0 关注
  • 971 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信