【问题标题】:JavaScript incorrect time showing between two time两个时间之间显示的 JavaScript 时间不正确
【发布时间】:2015-06-04 13:38:10
【问题描述】:

我试图在页面加载时显示两次之间的时间。 请检查下面我的代码 -

var start = document.getElementById("start").value;
var end = document.getElementById("end").value;

function hourDiff(start, end) {
    start = start.split(":");
    end = end.split(":");
    var startDate = new Date(0, 0, 0, start[0], start[1], 0);
    var endDate = new Date(0, 0, 0, end[0], end[1], 0);
    var diff = endDate.getTime() - startDate.getTime();
    var hours = Math.floor(diff / 1000 / 60 / 60);
    diff -= hours * 1000 * 60 * 60;
    var minutes = Math.floor(diff / 1000 / 60);
    
    return (hours < 9 ? "0" : "") + hours + ":" + (minutes < 9 ? "0" : "") + minutes;
    //setTimeout(function(){hourDiff(start, end)},500);
}

document.getElementById("diff").value = hourDiff(start, end);
<input id="start" value="20:00"> <!-- 08.00 PM -->
<input id="end" value="09:30"> <!-- 09.30 AM -->

<input id="diff">

我使用了开始时间 20.00 和结束时间 09.30 两者之间的差异是 = 13.30 小时,但它显示的时间错误。请检查并告诉我。

编辑:

我也想剩下多少hour:minute:second

【问题讨论】:

  • 这是这个问题的正确标题吗?
  • 这个问题没有 jQuery :D
  • 也没有任何onclick事件
  • 对不起,我写了另一个问题。错误标题未更改。
  • 您创建两个日期相同但时间不同的Date 以及您想要的两个小时在不同日期的事实是否会导致问题?我猜他们会的

标签: javascript jquery


【解决方案1】:

如果您的日期始终采用相同的格式 hh:mm,何不试试我的建议。

很简单:

var hours = end[0] - start[0];
if(start[0] > end[0]) {
    hours = 24 + hours;
}

var minutes = end[1] - start[1];
if(start[1] > end[1]) {
    minutes = 60 + minutes;
    if(hours == 0) {
        hours = 23;
    } else {
        hours--;
    }
}

我只是将它们相互减去,如果起始值大于结束值,则做出反应。 小提琴:https://jsfiddle.net/rvwr9h0w/1/

编辑

由于 Shotgun Ninja 的帖子,我找到了一个更简单的解决方案:

https://jsfiddle.net/rvwr9h0w/4/

var endDate = new Date(0, 0, (start > end)?1:0 , end[0], end[1], end[2]);

如果开始时间大于结束时间,只需提前 1 天设置结束日期。

【讨论】:

    【解决方案2】:

    好的,您的代码的问题是您从较晚的时间中减去较早的时间,这会导致负时差。我认为您的意思是让系统从晚上 8:00 前一天减去上午 9:30 第二天,但您没有提供任何信息表明它们是不同的日子。

    你有:

    var startDate = new Date(0, 0, 0, 20, 0, 0); // 8:00pm, Dec 31st, 1899 (current TZ)
    var endDate = new Date(0, 0, 0, 9, 30, 0);    // 9:30am, Dec 31st, 1899 (current TZ)
    

    (Year = 0 对应 1900 年,Month = 0 对应 1 月,Day = 0 对应 1 日前 1 天,回退到 12 月 31 日。)

    这里的重要部分是,通过将所有值设置为 0,您将获得同一天,但不同的时间。所以你实际上在差异中得到了一个 negative 值;代码正常运行,但由于日期不正确,因此给您一个负小时值。

    【讨论】:

      【解决方案3】:

      尝试将 Math.floor 与每个部分所需的整个数学方程式一起使用:

      var start = document.getElementById("start").value;
      var end = document.getElementById("end").value;
      
      function hourDiff(start, end) {
          start = start.split(":");
          end = end.split(":");
          var startDate = new Date(0, 0, 0, start[0], start[1], 0);
          var endDate = new Date(0, 0, 0, end[0], end[1], 0);
          var diff = endDate.getTime() - startDate.getTime();
          var msec = diff;
      var hh = Math.floor(msec / 1000 / 60 / 60);
      msec -= hh * 1000 * 60 * 60;
      var mm = Math.floor(msec / 1000 / 60);
          
          return hh + ":" + mm;
          //setTimeout(function(){hourDiff(start, end)},500);
      }
      
      document.getElementById("diff").value = hourDiff(start, end);
      <input id="start" value="20:00"> <!-- 08.00 PM -->
      <input id="end" value="09:30"> <!-- 09.30 AM -->
      
      <input id="diff">

      【讨论】:

      • 我回答了我认为的问题;用户想要“两次之间的时间”,我提供了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多