Asp.net 用JavaScript计算时间跨度

Asp.net 用JavaScript计算时间跨度,asp.net,javascript,Asp.net,Javascript,我有一个带有开始时间和结束时间文本框的.NET2.0ASCx控件。数据如下: txtStart.Text=09/19/2008 07:00:00 txtEnd.Text=09/19/2008 05:00:00 我想用JavaScript计算总时间(小时和分钟),然后将其显示在页面的文本框中 一旦预先知道文本框日期格式,就可以在Javascript中使用它将两者转换为时间戳,减去,然后写入结果文本框 同样地,stringToDate的代码也可以根据您的需要进行调整-下面采用格式为“YYYY-MM-

我有一个带有开始时间和结束时间文本框的.NET2.0ASCx控件。数据如下:

txtStart.Text=09/19/2008 07:00:00

txtEnd.Text=09/19/2008 05:00:00


我想用JavaScript计算总时间(小时和分钟),然后将其显示在页面的文本框中

一旦预先知道文本框日期格式,就可以在Javascript中使用它将两者转换为时间戳,减去,然后写入结果文本框

同样地,
stringToDate
的代码也可以根据您的需要进行调整-下面采用格式为“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;
    };
}
我把我做的东西拿出来,再加上我为你做的计算。我还添加了正则表达式,以确保时间是创建日期对象的字符串的一部分

<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>

函数stringToDate(字符串){
var匹配;
如果(matches=string.match(/^(\d{4,4})-(\d{2,2})-(\d{2,2})(\d{2,2}):(\d{2,2}):(\d{2,2})$/){
返回新日期(匹配[1],匹配[2]-1,匹配[3],匹配[4],匹配[5],匹配[6]);
}否则{
返回null;
};
}
//将持续时间从毫秒转换为0000:00:00.00格式
函数毫秒持续时间(n){
var hms=“”;
var dtm=新日期();
设置时间(n);
var h=“000”+数学楼层(n/3600000);
var m=“0”+dtm.getMinutes();
var s=“0”+dtm.getSeconds();
var cs=“0”+Math.round(dtm.getmillizes()/10);
hms=h.substr(h.length-4)+“:”+m.substr(m.length-2)+“:”;
hms+=s.substr(s.length-2)+“+cs.substr(cs.length-2);
返回hms;
}
变量beginDate=stringToDate('2008-09-1907:14:00');
var endDate=stringToDate('2008-09-19 17:35:00');
var n=endDate.getTime()-beginDate.getTime();
警报(毫秒持续时间(n));

这很粗糙,因为我编码得很快,但它很有效。我测试过了。警报框将显示0010:21:00.00(hhh:MM:SS.SS)。基本上,您所需要做的就是从文本框中获取值。

首先,答案假设为字符串操作。以下是一个适用于纯日期对象的解决方案:

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);
您可以使用getUTCHours()代替Math.floor(n/3600000)

使用Math.floor(n/3600000)代替getUTCHours(),否则损失的小时数将超过24小时

例如,如果有126980000毫秒,则应转换为0035:16:20.00

如果使用getUTCHours(),则会得到错误的字符串0011:16:20.00

更好的方法是使用此选项(由KK-MOD表示的修改):

函数毫秒持续时间(n){
var hms=“”;
var dtm=新日期();
设置时间(n);
var d=数学楼层(n/3600000/24);//KK-MOD
var h=“0”+(数学楼层(n/3600000)-(d*24));//KK-MOD
var m=“0”+dtm.getMinutes();
var s=“0”+dtm.getSeconds();
var cs=“0”+Math.round(dtm.getmillizes()/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秒

我喜欢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; }

函数毫秒持续时间(毫秒){
var n=数学绝对值(毫秒);
var hms=“”;
var dtm=新日期();
设置时间(n);
var d=数学楼层(n/3600000/24);//KK-MOD
var h=“0”+(数学地板(n/3600000)-(d*24));//KK-MOD
var m=“0”+dtm.getMinutes();
var s=“0”+dtm.getSeconds();
var cs=“0”+Math.round(dtm.getmillizes()/10);
hms=(毫秒<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);
返回hms;}
我还将“T”分隔符更改为“.”,以便于格式化

现在传入一个负值,例如-360000(负六分钟)将产生以下输出:


-00:06:00

我在谷歌上搜索javascript计算时间跨度,发现这个问题是这样的;不幸的是,问题文本和实际问题(只需要几个小时和几分钟)不一样。。。所以我想我是误会了

然而,我确实为问题标题写了一个答案——因此,如果其他人想要打印出“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);
}
函数formatTimespan(从,到){
变量文本=“”,
span={y:0,m:0,d:0,h:0,n:0};
函数calcSpan(n,fnMod){
while(从<到){
//修改日期,并检查“从现在起”是否超过“到”:
from=from[fnMod](1);
如果(从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');
附录文本(span.y,'年');
附录文本(span.m,“月”);
附录文本(span.d,“日”);
附录文本(span.h,“小时”);
附录文本(span.n,“分钟”);
if(text.lastIndexOf(',')小于0){
返回文本;
}
返回文本。子字符串(0,tex
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);
}