【问题标题】:How to add hours to string formatted as HH:MM:SS in 24 hour format如何以 24 小时格式向格式化为 HH:MM:SS 的字符串添加小时数
【发布时间】:2019-06-18 07:32:05
【问题描述】:

我正在尝试以 24 小时的格式添加时间,例如“23:59:59”。例如,我需要添加 2.5 小时,以便时间滚动到第二天并显示为“02:30:00”。

到目前为止,我所尝试的方法一直有效,直到达到“23:59:59”为止。如果它超过'23:59:59',我需要显示第二天的时间。到目前为止,这是我尝试过的:

var time = $('#starttime').val().split(':');
var d = new Date();
d.setHours(+time[0]);
d.setMinutes(time[1]);
d.setSeconds(time[2]);
var time2 = $('#endtime').val().split(':');
var endtimeval = new Date();
endtimeval.setHours(+time2[0]);
endtimeval.setMinutes(time2[1]);
endtimeval.setSeconds(time2[2]);
var str = d.getHours() + parseInt($('#noofhours').val()) + ":" + time2[1] + ":" + time2[2];
$('#endtime').val(str);

【问题讨论】:

  • 与其手动执行类似的操作,不如研究一下 date-fns 之类的库选项,例如
  • +1 表示@raphinesse 评论。我使用 Moment.js,它使所有这类事情变得容易,而且你不太可能在路上遇到错误或边缘情况
  • 你能帮我用普通的javascript做同样的事情吗? .我没有使用任何第三方 js 文件和 CDN 的状态。希望你能理解。
  • 请至少为您的代码创建一个minimal reproducible example。例如,现在我不知道你所说的这 2.5 个小时究竟应该藏在哪里。
  • (虽然 setHours 可能无法正确处理诸如 2.5 之类的值 - 因此使用该方法设置分钟可能会更容易,取而代之的是 2.5 * 60 作为值。)

标签: javascript datetime time time-format


【解决方案1】:

在这里使用日期对象可能是不必要的,模运算就足够了。

const pad = n => {
  const s = String(n);
  return s.length > 1 ? s : '0' + s;
};

const addHours = (timeVal, numHours) => {
  const [hr, min, sec] = timeVal.split(':').map(Number);
  const [,lefty, righty] = String(numHours).match(/(\d+)(?:(\.\d+))?/).map(Number);
  const hours = (hr + lefty) % 24;
  const minutes = righty === undefined ? 
    min : 
    ((righty * 60 | 0) + min) % 60;

  return [hours, minutes, sec].map(pad).join(':');  
};

addHours('23:59:59', 2.5) // "01:29:59"

请注意,由于不涉及日期,因此无法准确处理,例如夏令时。另请注意,此示例中的分钟是向下舍入的,如果需要,您可以将逻辑重复几秒钟。

请注意,出于相同的原因,您使用 Date 对象的方法会对相同的输入给出不同的答案,具体取决于逻辑运行的时间/地点。

【讨论】:

    【解决方案2】:

    制作自定义日期加法器?

    const add = (time, hours) => {
      let [hh, mm, ss] = time.split(':');
    
      const seconds = hours * 60 * 60;
    
      ss = ss * 1 + seconds;
      if (ss >= 60) { 
          mm = mm * 1 + ss / 60; 
          ss = (ss % 60).toPrecision(2).padStart(2, '0');
      }
    
      if (mm >= 60) {
        hh = hh * 1 + mm / 60;
        mm = (mm % 60).toPrecision(2).padStart(2, '0');
      }
    
      hh = (Math.floor(hh) % 24).toString().padStart(2, '0');
    
      return hh + ':' + mm + ':' + ss;
    }
    
    console.log(add("23:59:59", 2.5));
    

    您可以应用 DRY 原则并自己重构代码。但它会根据您的要求完成工作。

    【讨论】:

    • 其他一些表面上的差异,这与我回答中的方法有什么不同?
    【解决方案3】:

    我所做的简单技巧是将作为浮点数/整数输入的小时数乘以 60 转换为分钟值并创建一个日期,这只是添加了我已经拥有的时间。 这里的解决方案只需最少的步骤:

    var time = $('#endtime').val().split(':');
        var d = new Date(); 
        d.setHours(+time[0]); 
        d.setMinutes(time[1]); 
        d.setSeconds(time[2]);
        var addeddate = new Date();
        addeddate.setMinutes(parseFloat($('#noofhours').val()) * 60);
        $('#endtime').val(("0" + (addeddate.getHours())).slice(-2) + ":" + ("0" + (addeddate.getMinutes())).slice(-2) + ":" + ("0" + (addeddate.getSeconds())).slice(-2)); //The answer that I needed in endtime id value.
    

    【讨论】:

    • 请注意,您使用 Date 对象的方法将根据逻辑运行的时间/位置对相同的输入给出不同的答案
    【解决方案4】:

    您可以在这里相当轻松地使用原生 JavaScript 日期方法。大部分工作是解析时间字符串输入,然后连接时间字符串输出。例如:

    const start = '23:59:59';
    const add = '2.5';
    const [hh, mm, ss] = start.split(':').map(x => parseInt(x));
    const d = new Date(new Date().setHours(hh, mm + (add * 60), ss));
    const end = `${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}`;
    console.log(end);
    // 2:29:59

    【讨论】:

    • @SPYder - 我读了 cmets 但我不清楚你认为我会在那里看到什么会改变答案。随意详细说明。
    • 请注意,您使用 Date 对象的方法将对相同的输入给出不同的答案,具体取决于逻辑运行的时间/位置。
    • @JaredSmith,感谢您的评论。但是这个逻辑根据我需要的时区工作。
    • @benvc,以小时为单位的时间,这可能是浮点值,如 2.3,需要添加 24 小时格式的字符串,如 'HH:MM:SS' say ' 23:59:59'。这是我需要做的事情,我在上面解释过。
    • @SPYder - 除非我误解了你,否则上面的答案会处理浮点值并将它们转换为分钟以进行加法。运行 sn -p 你就会明白我的意思了。
    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多