У меня есть элемент управления ascx .net 2.0 с текстовыми полями времени начала и окончания. Данные следующие:
txtStart.Text = 19.09.2008 07:00:00
txtEnd.Text = 19.09.2008 05:00:00
Я хотел бы рассчитать общее время (часы и минуты) в JavaScript, а затем отобразить его в текстовом поле на странице.





Как только формат даты вашего текстового поля известен заранее, вы можете использовать Функции даты Мэтта Круза в Javascript, чтобы преобразовать два в метку времени, вычесть и затем записать в полученное текстовое поле.
Точно так же код Ввод даты JQuery для stringToDate может быть адаптирован для ваших целей - нижеприведенная строка принимает строку в формате «ГГГГ-ММ-ДД» и преобразует ее в объект даты. Метка времени (getTime()) этих объектов может использоваться для ваших расчетов.
stringToDate: function(string) {
var matches;
if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2})$/)) {
return new Date(matches[1], matches[2] - 1, matches[3]);
} else {
return null;
};
}
Я взял то, что сделал @PConroy, и добавил к нему, выполнив расчеты за вас. Я также добавил регулярное выражение, чтобы убедиться, что время является частью строки для создания объекта даты.
<html>
<head>
<script type = "text/javascript">
function stringToDate(string) {
var matches;
if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2}) (\d{2,2}):(\d{2,2}):(\d{2,2})$/)) {
return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
} else {
return null;
};
}
//Convert duration from milliseconds to 0000:00:00.00 format
function MillisecondsToDuration(n) {
var hms = "";
var dtm = new Date();
dtm.setTime(n);
var h = "000" + Math.floor(n / 3600000);
var m = "0" + dtm.getMinutes();
var s = "0" + dtm.getSeconds();
var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
hms = h.substr(h.length-4) + ":" + m.substr(m.length-2) + ":";
hms += s.substr(s.length-2) + "." + cs.substr(cs.length-2);
return hms;
}
var beginDate = stringToDate('2008-09-19 07:14:00');
var endDate = stringToDate('2008-09-19 17:35:00');
var n = endDate.getTime() - beginDate.getTime();
alert(MillisecondsToDuration(n));
</script>
</head>
<body>
</body>
</html>
Это довольно грубо, так как я написал это довольно быстро, но это работает. Я это проверил. В окне предупреждения будет отображаться 0010: 21: 00.00 (ЧЧЧЧ: ММ: СС.СС). В основном все, что вам нужно сделать, это получить значения из ваших текстовых полей.
Ответы, прежде всего, предполагают манипуляции со строками. Вот решение, которое работает с чистыми объектами даты:
var start = new Date().getTime();
window.setTimeout(function(){
var diff = new Date(new Date().getTime() - start);
// this will log 0 hours, 0 minutes, 1 second
console.info(diff.getHours(), diff.getMinutes(),diff.getSeconds());
},1000);
function stringToDate(string) {
var matches;
if (matches = string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2}) (\d{2,2}):(\d{2,2}):(\d{2,2})$/)) {
return new Date(matches[1], matches[2] - 1, matches[3], matches[4], matches[5], matches[6]);
} else {
return null;
};
}
function getTimeSpan(ticks) {
var d = new Date(ticks);
return {
hour: d.getUTCHours(),
minute: d.getMinutes(),
second: d.getSeconds()
}
}
var beginDate = stringToDate('2008-09-19 07:14:00');
var endDate = stringToDate('2008-09-19 17:35:00');
var sp = getTimeSpan(endDate - beginDate);
alert("timeuse:" + sp.hour + " hour " + sp.minute + " minute " + sp.second + " second ");
вы можете использовать getUTCHours () вместо Math.floor (n / 3600000);
Используйте Math.floor (n / 3600000) вместо getUTCHours (), иначе вы потеряете количество часов, превышающее 24.
Например, если у вас 126980000 миллисекунд, это должно быть 0035: 16: 20.00.
Если вы используете getUTCHours (), вы получите неверную строку 0011: 16: 20.00
Лучше вместо этого используйте это (модификации обозначаются KK-MOD):
function MillisecondsToDuration(n) {
var hms = "";
var dtm = new Date();
dtm.setTime(n);
var d = Math.floor(n / 3600000 / 24); // KK-MOD
var h = "0" + (Math.floor(n / 3600000) - (d * 24)); // KK-MOD
var m = "0" + dtm.getMinutes();
var s = "0" + dtm.getSeconds();
var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
hms = (d > 0 ? d + "T" : "") + h.substr(h.length - 2) + ":" + m.substr(m.length - 2) + ":"; // KK-MOD
hms += s.substr(s.length - 2) + "." + cs.substr(cs.length - 2);
return hms; }
Итак, теперь 192680000 отображается как 1T11: 16: 20.00, что составляет 1 день 11 часов 16 минут и 20 секунд.
Мне нравится подход K3 + KK-MOD, но мне нужно было показать отрицательные временные интервалы, поэтому я внес следующие изменения:
function MillisecondsToDuration(milliseconds) {
var n = Math.abs(milliseconds);
var hms = "";
var dtm = new Date();
dtm.setTime(n);
var d = Math.floor(n / 3600000 / 24); // KK-MOD
var h = "0" + (Math.floor(n / 3600000) - (d * 24)); // KK-MOD
var m = "0" + dtm.getMinutes();
var s = "0" + dtm.getSeconds();
var cs = "0" + Math.round(dtm.getMilliseconds() / 10);
hms = (milliseconds < 0 ? " - " : "");
hms += (d > 0 ? d + "." : "") + h.substr(h.length - 2) + ":" + m.substr(m.length - 2) + ":"; // KK-MOD
hms += s.substr(s.length - 2) + "." + cs.substr(cs.length - 2);
return hms; }
Я также изменил разделитель «Т» на «. для моего собственного форматирования.
Теперь переданное отрицательное значение, скажем -360000 (отрицательные шесть минут), даст следующий результат:
- 00:06:00
Я погуглил для расчета промежутка времени в javascript и нашел этот вопрос на SO; к сожалению, текст вопроса и фактический вопрос (требующий только часы и минуты) не совпадают ... поэтому я думаю, что прибыл сюда по ошибке.
Однако я написал ответ на заголовок вопроса - поэтому, если кто-то еще хочет что-то, что напечатает что-то вроде «1 год и 15 минут», то это для вас:
function formatTimespan(from, to) {
var text = '',
span = { y: 0, m: 0, d: 0, h: 0, n: 0 };
function calcSpan(n, fnMod) {
while (from < to) {
// Modify the date, and check if the from now exceeds the to:
from = from[fnMod](1);
if (from <= to) {
span[n] += 1;
} else {
from = from[fnMod](-1);
return;
}
}
}
function appendText(n, unit) {
if (n > 0) {
text += ((text.length > 0) ? ', ' : '') +
n.toString(10) + ' ' + unit + ((n === 1) ? '' : 's');
}
}
calcSpan('y', 'addYears');
calcSpan('m', 'addMonths');
calcSpan('d', 'addDays');
calcSpan('h', 'addHours');
calcSpan('n', 'addMinutes');
appendText(span.y, 'year');
appendText(span.m, 'month');
appendText(span.d, 'day');
appendText(span.h, 'hour');
appendText(span.n, 'minute');
if (text.lastIndexOf(',') < 0) {
return text;
}
return text.substring(0, text.lastIndexOf(',')) + ', and' + text.substring(text.lastIndexOf(',') + 1);
}
В вопросе явно указано «часы и минуты».