2011-12-16 270 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介紹。