【问题标题】:How to calculate the time difference between 2 date time values如何计算 2 个日期时间值之间的时间差
【发布时间】:2014-01-12 21:11:44
【问题描述】:

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

我有 2 个输入,其中输入字符串类似于“1:00 PM”和第二个“3:15 PM”。我想知道时差。所以对于上面的例子,我想显示 3.15

我做了什么:

  1. 将时间转换为 24 小时格式。所以“下午 1:00”变成了“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 PM”和“3:15 PM”之间的差是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 输入只显示整数值。

我该如何解决这个问题?

【问题讨论】:

标签: date time


【解决方案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 等等。

【讨论】:

  • 由于某种原因,这对我不起作用。请检查我的问题,我添加了我正在使用的代码。谢谢
  • “start_time”和“end_time”在使用前是什么格式?初始化后“总计”是什么格式?它是一个字符串还是只是几毫秒?请提供更多细节。
  • @BrianLegg - 让我们假设 OP 不再有此代码的问题,已经两年了?
  • 我可能不是 OP,但我正在尝试做同样的事情并想要更多细节。不过没关系,我找到了我正在寻找的答案。谢谢
【解决方案2】:

我是这样计算的:

    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();
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多