【问题标题】:How can I convert time to decimal number in JavaScript?如何在 JavaScript 中将时间转换为十进制数?
【发布时间】:2012-06-09 06:03:54
【问题描述】:

我懒得在每个月底填写我的工作时间表,所以我开始在我们的 PDF 表单中添加一些功能。 Acrobat Pro 提供使用 JavaScript 进行高级计算,但我遇到了这个问题。

我有两个字段可以输入我开始/结束工作的时间。我想计算我的加班时间并将结果输出到第三个字段中。但是,我希望输出为十进制,所以当我加班半小时时,结果将是 0.5

示例:我的工作时间是 8.5 小时,我从 7.30 开始,在 16.00(下午 4 点)结束。

到目前为止我的代码:

var workTime = this.getField("Work time").value;
var startTime = this.getField("Start time").value;
var endTime = this.getField("End time").value;

event.value = workTime - (endTime - startTime);

【问题讨论】:

    标签: javascript datetime pdf time acrobat


    【解决方案1】:

    小时和分钟分开,分钟除以60,再加上小时。

    function timeStringToFloat(time) {
      var hoursMinutes = time.split(/[.:]/);
      var hours = parseInt(hoursMinutes[0], 10);
      var minutes = hoursMinutes[1] ? parseInt(hoursMinutes[1], 10) : 0;
      return hours + minutes / 60;
    }
    

    【讨论】:

    【解决方案2】:

    就我而言,我用它来计算发票时间

    输入可以包含这 6 种为用户编写它的方式:

    • 1 -> 1 小时 0 分钟
    • 1,2 -> 1 小时 12 分钟
    • 1.5 -> 1 小时 30 分钟
    • 1:30 -> 1 小时 30 分钟
    • 1h40 -> 1 小时 40 分钟
    • 45m -> 0 小时 45 分钟

    所以我使用了这个(感谢 Amadan),这是工作代码:

    function time2dec(tIn) {
        if(tIn == '') 
            return 0;
        if(tIn.indexOf('h') >= 0 || tIn.indexOf(':') >= 0)
            return hm2dec(tIn.split(/[h:]/));
        if(tIn.indexOf('m') >= 0)
            return hm2dec([0,tIn.replace('m','')]);
        if(tIn.indexOf(',') >= 0)
            return parseFloat(tIn.split(',').join('.')).toFixed(2);
        if(tIn.indexOf('.') >= 0)
            return parseFloat(tIn);
        return parseInt(tIn, 10);
    }
    
    function hm2dec(hoursMinutes) {
        var hours = parseInt(hoursMinutes[0], 10);
        var minutes = hoursMinutes[1] ? parseInt(hoursMinutes[1], 10) : 0;
        return (hours + minutes / 60).toFixed(2);
    }
    

    使用示例(使用 jQuery):

    var qty = time2dec($('#qty').val());
    var price = parseFloat($('#price').val());
    var total = (qty * price).toFixed(2);
    

    希望它可以帮助我们中的一些人。

    【讨论】:

      【解决方案3】:

      另一种方式;)

      var aHours = 4.45;
      
      var aHoursInMinutes = (Math.floor(aHours) * 60 )+ ((aHours - Math.floor(aHours)) * 100);
       // 285 minutes;
      
      var afromMinutesToHours = 
      (Math.floor(aHoursInMinutes /60) + ((aHoursInMinutes - (60* Math.floor(aHoursInMinutes /60)))/100));
       // 4.45 hours;
      
      var bHours = 0.33;
      
      var bHoursInMinutes = (Math.floor(bHours) * 60 )+ ((bHours - Math.floor(bHours)) * 100); // 33 minutes;
      
      var bFromMinutesToHours = 
      (Math.floor(bHoursInMinutes / 60) + (( bHoursInMinutes - (60 * Math.floor(bHoursInMinutes / 60)))/100)); // 0.33 hours;
      
      var resultInMinutes = aHoursInMinutes + bHoursInMinutes;
      var resultToHours = 
      (Math.floor(resultInMinutes / 60) + (( resultInMinutes - (60 * Math.floor(resultInMinutes  / 60)))/100)); // 5.18 hours;
      

      【讨论】:

        【解决方案4】:

        作为替代方案,我很好奇这是否可以使用 Date.parse 完成,并且可以。

        以下代码返回与所选答案相同的值,但垃圾输入除外,在这种情况下它返回零。使用 1970 日期是因为 UNIX 时间为零。

        请注意,MDN 说:“在 ES5 之前不建议使用 Date.parse,字符串的解析完全依赖于实现。”

        var test = [undefined, null, "", "garbage", "0", "00:00", "  01:11", "3:44", "2:3", "5.06"];
        var hours = 0;
        var html = "<table>";
        
        for (var i = 0; i < test.length; i++) {
          html += "<tr>";
          html += "<td>" + test[i] + "</td>";
          hours = timeStringToFloat(test[i]);
          html += "<td>" + hours + "</td>";
          hours = timeStringToNumber(test[i]);
          html += "<td>" + hours + "</td>";
          html += "<td>" + hoursToString(hours) + "</td>";
          html += "</tr>";
        }
        stdout.innerHTML = html;
        
        function timeStringToNumber(time) {
          return ((new Date(("01 Jan 1970 " + time || "").replace(".", ":") + " GMT")) / 3600000) || 0;
        }
        
        function timeStringToFloat(time) {
          try {
            var hoursMinutes = time.split(/[.:]/);
            var hours = parseInt(hoursMinutes[0], 10);
            var minutes = hoursMinutes[1] ? parseInt(hoursMinutes[1], 10) : 0;
            return hours + minutes / 60;
          } catch (e) {
            return "ERROR";
          }
        }
        
        function hoursToString(hours) {
          var minutes = hours * 60;
          return (
            ("00" + Math.floor(minutes / 60)).slice(-2) +
            ":" +
            ("00" + Math.round(minutes % 60)).slice(-2)
          );
        }
        body {
          font-family: sans-serif;
          font-size: 12px;
        }
        
        h4 {
          color: white;
          background-color: steelblue;
          padding: 0.5em;
        }
        
        table {
          border-collapse: collapse;
        }
        
        table td {
          border: 1px solid gray;
          min-height: 1em;
        }
        <h4>Test Output:</h4>
        Method A is the original and Method B the alternative.
        <table>
          <thead>
            <tr>
              <th>String</th>
              <th>Method A</th>
              <th>Method B</th>
              <th>ToString</th>
            </tr>
          </thead>
          <tbody id="stdout"></tbody>
        </table>

        *

        function timeStringToNumber( time ) 
        {
            return ((new Date(("01 Jan 1970 " + time || "").replace(".",":") + " GMT")) / 3600000) || 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2010-09-08
          • 2014-03-13
          • 2015-03-12
          • 2022-01-14
          • 2016-05-09
          • 1970-01-01
          • 2015-11-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多