2011-12-16 200 views
9

我正在计算两个日期之间的差异,其中有许多不同的示例可用。返回的时间以毫秒为单位,因此我需要将其转换为更有用的内容。Javascript以毫秒为单位显示毫秒数:小时:无秒数分钟

大多数例子都是天:小时:分钟:秒或小时:分钟,但我需要天:小时:分钟因此秒数应该四舍五入到分钟中。

我目前使用的方法会很近,但显示3天为2.23.60当它应该显示3.00.00,所以有些事情不太正确。正如我刚刚从网络上的示例中获取当前代码一样,我愿意提供其他方式的建议。

我从一个结束日期减去如下起始日期获取以毫秒为单位的时间: -

date1 = new Date(startDateTime); 
date2 = new Date(endDateTime); 
ms = Math.abs(date1 - date2) 

我基本上需要采取毫秒变量,在转成days.hours:分钟。

+2

小心分享一些代码? – 2011-12-16 00:21:54

+0

听起来像“你正在使用的方法”几乎是正确的!为什么不解决它? – 2011-12-16 00:22:24

+0

你能发表一些你正在做的事情吗?它看起来像你做错了。此外,检查出http://stackoverflow.com/questions/1056728/formatting-a-date-in-javascript – austinfromboston 2011-12-16 00:25:21

回答

17

像这样的事情?

function dhm(t){ 
    var cd = 24 * 60 * 60 * 1000, 
     ch = 60 * 60 * 1000, 
     d = Math.floor(t/cd), 
     h = Math.floor((t - d * cd)/ch), 
     m = Math.round((t - d * cd - h * ch)/60000), 
     pad = function(n){ return n < 10 ? '0' + n : n; }; 
    if(m === 60){ 
    h++; 
    m = 0; 
    } 
    if(h === 24){ 
    d++; 
    h = 0; 
    } 
    return [d, pad(h), pad(m)].join(':'); 
} 

console.log(dhm(3 * 24 * 60 * 60 * 1000)); 
+1

非常感谢Mic,在所有的例子中,我发现你的代码在抛出不同的值时是最可靠的。非常感激。 – Mitch 2011-12-17 14:27:46

1

“返回的时间以毫秒为单位,所以我需要将其转换为更有用的东西。”

你从服务器回来的时间还是这个纯粹的JavaScript?

部分代码真的帮助。 “有用的东西”有点含糊。

这里是一个例子,我想这就是你正在谈论的。

<script type="text/javascript"> 

//Set the two dates 
var millennium =new Date(2000, 0, 1) //Month is 0-11 in JavaScript 
today=new Date() 
//Get 1 day in milliseconds 
var one_day=1000*60*60*24 

//Calculate difference btw the two dates, and convert to days 
document.write(Math.ceil((today.getTime()-millennium.getTime())/(one_day))+ 
" days has gone by since the millennium!") 

</script> 
4367 days has gone by since the millennium! 
+0

[没有0年](http://en.wikipedia.org/wiki/Year_0)。您应该使用1/1/2001作为参考日期。 – aroth 2011-12-16 00:38:18

0

没有代码,很难确切地说出你有哪个错误,但我怀疑你完全按照你所说的做了:四舍五入。如果向下舍入不够好,以下是如何舍入到最近:

var time = date.getTime(); 
if (time % 60000 >= 30000) time += 60000; 

然后继续计算。

3

在这里你去:

http://jsfiddle.net/uNnfH/1

或者,如果你不想与正在运行的例子来打的话:

window.minutesPerDay = 60 * 24; 

function pad(number) { 
    var result = "" + number; 
    if (result.length < 2) { 
     result = "0" + result; 
    } 

    return result; 
} 

function millisToDaysHoursMinutes(millis) { 
    var seconds = millis/1000; 
    var totalMinutes = seconds/60; 

    var days = totalMinutes/minutesPerDay; 
    totalMinutes -= minutesPerDay * days; 
    var hours = totalMinutes/60; 
    totalMinutes -= hours * 60; 

    return days + "." + pad(hours) + "." + pad(totalMinutes); 
} 
+0

感谢您的建议,我结束了许多不同的方法,这是一个与我一起去的密切运行的事情。我之前没有见过jsfiddle,所以非常感谢你向我介绍了它。 – Mitch 2011-12-17 14:30:37

2

说不上有多少答案需要,但这里的另一个 - 只是一个采取已经被赋予了几个答案:跨越夏令边界

function msToDHM(v) { 
    var days = v/8.64e7 | 0; 
    var hrs = (v % 8.64e7)/ 3.6e6 | 0; 
    var mins = Math.round((v % 3.6e6)/6e4); 

    return days + ':' + z(hrs) + ':' + z(mins); 

    function z(n){return (n<10?'0':'')+n;} 
} 

请注意使用这样的计算虽然,句号会导致问题。最好在UTC工作,并转换为当地时间进行演示。

11

听起来像Moment.js的工作。

var diff = new moment.duration(ms); 
diff.asDays();  // # of days in the duration 
diff.asHours(); // # of hours in the duration 
diff.asMinutes(); // # of minutes in the duration 

有一吨的其他方式MomentJS格式化的持续时间。docs非常全面。

4

不知道为什么,但别人没有为我工作所以这里是我的

function dhm(ms){ 
    days = Math.floor(ms/(24*60*60*1000)); 
    daysms=ms % (24*60*60*1000); 
    hours = Math.floor((daysms)/(60*60*1000)); 
    hoursms=ms % (60*60*1000); 
    minutes = Math.floor((hoursms)/(60*1000)); 
    minutesms=ms % (60*1000); 
    sec = Math.floor((minutesms)/(1000)); 
    return days+":"+hours+":"+minutes+":"+sec; 
} 

alert(dhm(500000)); 
0

随着moment.js试试这个:

function getFormattedMs(ms) { 
    var duration = moment.duration(ms); 
    return moment.utc(duration.asMilliseconds()).format("mm:ss"); 
} 

当你想展示你不得不小时有一种变通方法:

function formatDuration(ms) { 
    var duration = moment.duration(ms); 
    return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss"); 
} 

此解决方案在一瞬间被这个Issue介绍。