2011-12-16 48 views
9

Tôi đang tính toán sự khác biệt giữa 2 ngày có nhiều ví dụ khác nhau có sẵn. Thời gian trả về là một phần nghìn giây vì vậy tôi cần phải chuyển đổi nó thành một cái gì đó hữu ích hơn.Javascript hiển thị mili giây như ngày: giờ: phút mà không có giây

Hầu hết các ví dụ là ngày: giờ: phút: giây hoặc giờ: phút, nhưng tôi cần ngày: giờ: phút để giây được làm tròn thành phút.

Phương pháp tôi hiện đang sử dụng sẽ đóng nhưng hiển thị 3 ngày là 2,23,60 khi hiển thị 3.00,00 để có điều gì đó không ổn. Khi tôi chỉ lấy mã hiện tại từ một ví dụ trên web, tôi mở để gợi ý cho các cách khác để làm điều này.

Tôi lấy giờ trong mili giây bằng cách trừ đi một ngày bắt đầu từ ngày kết thúc như sau: -

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

tôi về cơ bản cần phải thực hiện các biến ms và biến trong thành days.hours: phút.

+2

Bạn muốn chia sẻ một số mã? –

+0

Âm thanh như "phương pháp bạn hiện đang sử dụng" gần như đúng! Tại sao không sửa chữa nó? –

+0

Bạn có thể đăng một số mã cho những gì bạn đang làm không? Nó chắc chắn có vẻ như bạn đang làm sai. Ngoài ra, hãy xem http://stackoverflow.com/questions/1056728/formatting-a-date-in-javascript – austinfromboston

Trả lời

17

Something như thế này?

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

Rất cám ơn Mic, trong tất cả các ví dụ tôi đã tìm thấy mã của bạn đáng tin cậy nhất khi ném các giá trị khác nhau vào nó. Nhiều đánh giá cao. – Mitch

1

"Thời gian được trả về bằng mili giây, vì vậy tôi cần chuyển đổi nó thành thứ gì đó hữu ích hơn".

Bạn có nhận được thời gian từ máy chủ hoặc JavaScript thuần túy này không?

Một số mã sẽ thực sự trợ giúp. "Một cái gì đó hữu ích" là loại mơ hồ.

Đây là một ví dụ, tôi nghĩ đây là những gì bạn đang nói đến.

<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

[Không có năm 0] (http://en.wikipedia.org/wiki/Year_0). Bạn nên sử dụng 1/1/2001 làm ngày tham chiếu của mình. – aroth

0

Nếu không có mã, thật khó để nói chính xác lỗi nào bạn có, nhưng tôi nghi ngờ bạn đang làm chính xác như bạn đã nói: làm tròn lên. Nếu làm tròn xuống không đủ tốt cho bạn, dưới đây là cách làm tròn đến gần nhất:

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

và sau đó tiếp tục tính toán.

3

Ở đây bạn đi:

http://jsfiddle.net/uNnfH/1

Hoặc nếu bạn không muốn chơi với một ví dụ chạy, sau đó:

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

Cảm ơn vì gợi ý của bạn, tôi đã kết thúc với nhiều cách tiếp cận khác nhau và đó là một điều gần gũi mà tôi đã đi cùng. Tôi đã không nhìn thấy jsfiddle trước khi cảm ơn vì đã giới thiệu tôi với nó. – Mitch

2

Dunno bao nhiêu câu trả lời bạn cần, nhưng đây là một - chỉ là một gánh vác một vài câu trả lời đã được đưa ra:

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

Hãy chăm sóc với các tính toán như vậy, mặc dù thời gian qua tiết kiệm ranh giới giữa ban ngày sẽ gây ra vấn đề. Luôn luôn làm việc tốt hơn trong UTC và chuyển đổi thành giờ địa phương để trình bày.

+0

Cảm ơn RobG, tôi sẽ ghi nhớ điều này. – Mitch

11

Có vẻ như một công việc cho 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 

Có rất nhiều cách khác để định dạng thời lượng trong MomentJS.docs rất toàn diện.

4

Dont biết tại sao nhưng những người khác không làm việc cho tôi vì vậy đây là của tôi

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

awesome !!!!!!!!!!!!!!! – Edit

0

Với moment.js thử điều này:

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

Khi bạn muốn hiển thị giờ bạn phải có giải pháp thay thế:

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

Cách khắc phục này được giới thiệu trong Issue này.

Các vấn đề liên quan