Как я могу преобразовать время в десятичное число в JavaScript?

Я слишком ленив, чтобы заполнять свой рабочий график до конца каждого месяца, поэтому я начал добавлять некоторые функции в нашу PDF-форму. Acrobat Pro предлагает выполнять расширенные вычисления с использованием JavaScript, но я застрял с этой проблемой.

У меня есть два поля, в которые я ввожу время начала / окончания работы. Я хочу рассчитать свое сверхурочное время и вывести результат в третьем поле. тем не менее, я хочу, чтобы вывод был десятичным, поэтому, когда я получаю сверхчасовую сверхурочную работу, результат будет 0,5

Пример: мое рабочее время составляет 8,5 часов, я начинаю в 7:30 и заканчиваю в 16:00 (16:00).

Мой код до сих пор:

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 ответа

Решение

Разделяйте часы и минуты, делите минуты на 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;
}

В моем случае я использую его для расчета времени на счете.

Входные данные могут содержать эти 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);

Надеюсь, что это может помочь некоторым из нас.

По-другому;)

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;

Как альтернатива, мне было любопытно, можно ли это сделать с помощью Date.parse и может.

Следующий код возвращает те же значения, что и выбранный ответ, за исключением ввода мусора, в этом случае он возвращает ноль. Дата 1970 года используется, потому что это нулевой момент времени UNIX.

Обратите внимание, что MDN говорит: "Не рекомендуется использовать Date.parse, так как до ES5 разбор строк полностью зависел от реализации".

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;
}
Другие вопросы по тегам