8

毎月末までに仕事でタイムシートに記入するのが面倒なので、PDFフォームにいくつかの機能を追加し始めました。Acrobat Proは、JavaScriptを使用して高度な計算を行うことを提案していますが、私はこの問題に悩まされています。

作業を開始/終了する時刻を入力するフィールドが2つあります。残業を計算し、その結果を3番目のフィールドに出力したいと思います。ただし、出力を10進数にしたいので、30分残業すると、結果は0.5になります。

例:私の作業時間は8.5時間で、7.30から開始し、16.00(4 pm)に終了します。

これまでの私のコード:

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分
  • 1時間40分>1時間40分
  • 45分->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ありました。

次のコードは、ガベージ入力を除いて、選択した回答と同じ値を返します。ガベージ入力の場合、ゼロが返されます。UNIX時間ゼロであるため、1970年の日付が使用されます。

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 に答える