我有一个带有开始时间和结束时间文本框的.net 2.0 ascx控件。数据如下:
txtStart.Text = 09/19/2008 07:00:00
txtEnd.Text = 09/19/2008 05:00:00
我想用JavaScript计算总时间(小时和分钟),然后将其显示在页面的文本框中。
答案 0 :(得分:6)
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);
答案 1 :(得分:5)
提前知道文本框日期格式后,您可以在Javascript中使用Matt Kruse's Date functions将两者转换为时间戳,减去然后写入生成的文本框。
同样,stringToDate
的{{3}}代码可以根据您的需要进行调整 - 下面采用格式为“YYYY-MM-DD”的字符串并将其转换为日期对象。这些对象的时间戳(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;
};
}
答案 2 :(得分:4)
我接受了@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(HHHH:MM:SS.SS)。基本上您需要做的就是从文本框中获取值。
答案 3 :(得分:2)
上面的答案都假设字符串操作。这是一个适用于纯日期对象的解决方案:
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.log(diff.getHours(), diff.getMinutes(),diff.getSeconds());
},1000);
答案 4 :(得分:1)
我用Google搜索计算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);
}
答案 5 :(得分:0)
使用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);
返回hms; }
现在,192680000显示为1T11:16:20.00,即1天11小时16分20秒
答案 6 :(得分:0)
我喜欢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; }
我还将'T'分隔符更改为'。'为了我自己的格式化目的。
现在传入负值,比如-360000(负6分钟)将产生以下输出:
- 00:06:00