8

我懒得在每个月底填写我的工作时间表,所以我开始在我们的 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);
4

4 回答 4

21

分开小时和分钟,将分钟除以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;
}
于 2012-06-05T08:02:28.553 回答
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);

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

于 2016-04-01T08:41:08.513 回答
0

另一种方式 ;)

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;
于 2017-11-27T17:08:54.647 回答
0

作为替代方案,我很好奇这是否可以使用来完成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;
}
于 2018-04-16T01:36:23.703 回答