如何计算两个日期时间值之间的时间差?

5

我正在尝试计算两个日期时间字符串之间的时间差。

我有两个输入,其中输入字符串类似于“1:00 PM”和“3:15 PM”。我想知道时间差。因此,对于上面的示例,我想显示3.15。

我所做的:

  1. 将时间转换为24小时格式。因此,“1:00 PM”变成了“13:00:00”
  2. 将新时间追加到日期中,如下所示:new Date("1970-1-1 13:00:00")
  3. 按以下方式计算差异:

代码:

var total = Math.round(((new Date("1970-1-1 " + end_time) - 
                         new Date("1970-1-1 " + start_time) ) / 1000 / 3600) , 2 )

但总数始终返回整数而不是小数,因此“下午1:00”和“下午3:15”的差异为2而不是2.15。

我还尝试过这个(使用jQuery,但与此无关):

$('#to_ad,#from_ad').change(function(){
    $('#total_ad').val( getDiffTime() );
});

function fixTimeString(time){
    var hours = Number(time.match(/^(\d+)/)[1]);
    var minutes = Number(time.match(/:(\d+)/)[1]);
    var AMPM = time.match(/\s(.*)$/)[1];
    if(AMPM == "PM" && hours<12) hours = hours+12;
    if(AMPM == "AM" && hours==12) hours = hours-12;
    var sHours = hours.toString();
    var sMinutes = minutes.toString();
    if(hours<10) sHours = "0" + sHours;
    if(minutes<10) sMinutes = "0" + sMinutes;
    return sHours + ':' + sMinutes + ':00';
}

function getDiffTime(){
    var start_time = fixTimeString($('#from_ad').val());
    var end_time = fixTimeString($('#to_ad').val());
    var start = new Date("1970-1-1 " + end_time).getTime(),
    end   = new Date("1970-1-1 " + start_time).getTime();
    return parseInt(((start  - end) / 1000 / 3600, 10)*100) / 100;
}

但是total_ad输入框只显示整数值。

我应该如何解决这个问题?


可能是使用jQuery比较两个时间的重复问题。 - isherwood
1
jQuery在哪里发挥作用?它不仅仅是普通的JavaScript吗? - biziclop
2个回答

1

Math.round 方法将数字四舍五入为最接近的整数,建议使用乘法和除法代替。

var start = new Date("1970-1-1 " + start_time).getTime(),
    end   = new Date("1970-1-1 " + end_time).getTime();

var total = (parseInt(((start-end) / 1000 / 3600)*100, 10)) / 100;

FIDDLE

当你从15:15:00减去13:00:00时,剩下的是2.15小时,而不是3.15小时,即使没有确保只有两位小数,这个例子也会返回2.15,但对于其他时间可能不是这种情况。
你也可以使用toFixed(2),但那会让你得到3.00而不是3等。


这个对我来说不起作用,原因不明。请检查我的问题并查看我正在使用的代码。谢谢。 - Mike
在使用"start_time"和"end_time"之前,它们的格式是什么?在初始化"total"后,它的格式是什么?它是一个字符串还是毫秒数?请提供更多细节。 - BrianLegg
@BrianLegg - 假设原帖作者已经不再对这段代码有疑问了,毕竟已经过去两年了? - adeneo
我可能不是原帖作者,但我也想做同样的事情并需要更多细节。不过没关系,我已经找到了我要找的答案。谢谢。 - BrianLegg

0

这是我的计算方法:

    calculateDiff();

function calculateDiff(){
        _start = "7:00 AM";
        _end = "1:00 PM";

        _start_time = parseAMDate(_start);
        _end_time = parseAMDate(_end);

        if (_end_time < _start_time){
            _end_time = parseAMDate(_end,1);
        }

        var difference= _end_time - _start_time;

        var hours = Math.floor(difference / 36e5),
            minutes = Math.floor(difference % 36e5 / 60000);
        if (parseInt(hours) >= 0 ){
            if (minutes == 0){
                minutes = "00";
            }
            alert(hours+":"+minutes);
        }
    }

    function parseAMDate(input, next_day) {

        var dateReg = /(\d{1,2}):(\d{2})\s*(AM|PM)/;

        var hour, minute, result = dateReg.exec(input);

        if (result) {
            hour = +result[1];
            minute = +result[2];

            if (result[3] === 'PM' && hour !== 12) {
                hour += 12;
            }
        }
        if (!next_day) {
            return new Date(1970, 01, 01, hour, minute).getTime();
        }else{
            return new Date(1970, 01, 02, hour, minute).getTime();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接