Как я могу преобразовать время в десятичное число в 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;
}