2013-01-04 35 views
8

Tôi có bộ đếm thời gian còn lại để tải lên tệp. Thời lượng còn lại được tính toán và chuyển đổi thành mili giây như sau:Làm cách nào để nhân bản thời lượng hoàn chỉnh này trong moment.js/javascript

var elapsedTime = e.timeStamp - timestarted; 
var speed = e.loaded/elapsedTime; 
var estimatedTotalTime = e.totalSize/speed; 
var timeLeftInSeconds = (estimatedTotalTime - elapsedTime)/1000; 

Sau đó, tôi tạo một mảng mà tôi dự định xây dựng thành chuỗi nhân bản. Các mảng như sau:

var time = { 
       years : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').years()), 
       months : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').months()), 
       days : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').days()), 
       hours : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').hours()), 
       minutes : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').minutes()), 
       seconds : Math.round(moment.duration(timeLeftInSeconds, 'milliseconds').seconds()) 
}; 

này tất cả các công trình một cách hoàn hảo và nếu tôi đầu ra một chuỗi đại diện của dữ liệu này như sau:

console.log(time.years + ' years, ' + time.months + ' months, ' + time.days + ' days, ' + time.hours + ' hours, '+ time.minutes + ' minutes, ' + time.seconds + ' seconds'); 

tôi nó trả về một dòng đơn giản tốt đẹp của thời gian còn lại như sau:

0 years, 0 months, 0 days, 0 hours, 1 minutes, 7 seconds 

Điều tôi cần làm là nhân bản đầu ra này để chuỗi được xây dựng tùy thuộc vào thời gian còn lại. ví dụ

  • 2 năm và 3 tháng còn lại
  • 1 giờ, 32 phút và 41 giây còn lại
  • 7 giây còn lại
  • 3 phút 46 giây còn lại
  • 6 giây còn lại

etc ... etc ...

Bây giờ tôi biết rằng mo ment.js có khả năng tự động nhân bản thời lượng hoạt động tốt cho các giá trị đơn lẻ nhưng điều này có thể có nhiều giá trị có thể (giờ/phút/giây, v.v.)

Làm cách nào để chuyển dữ liệu này bằng moment.js hoặc bằng xây dựng chuỗi bằng tay?

Xin cảm ơn trước.

Trả lời

7

Tôi nghĩ rằng đặt cược tốt nhất của bạn sẽ là một cái gì đó như thế này:

function humanize(time){ 
    if(time.years > 0){ return time.years + ' years and '  + time.months + ' months remaining';} 
    if(time.months > 0){ return time.months + ' months and ' + time.days  + ' days remaining';} 
    if(time.days > 0){ return time.days + ' days and '  + time.hours + ' hours remaining';} 
    if(time.hours > 0){ return time.hours + ' hours and '  + time.minutes + ' minutes and ' + time.seconds + ' seconds remaining';} 
    if(time.minutes > 0){ return time.minutes + ' minutes and ' + time.seconds + ' seconds remaining';} 
    if(time.seconds > 0){ return time.seconds + ' seconds remaining';} 
    return "Time's up!"; 
} 

Ngoài ra, bạn có thể sử dụng chức năng này:

function humanize(time){ 
    var o = ''; 
    for(key in time){ 
     if(time[key] > 0){ 
      if(o === ''){ 
       o += time[key] + ' ' + key + ' '; 
      }else{ 
       return o + 'and ' + time[key] + ' ' + key + ' remaining'; 
      } 
     } 
    } 
    return o + 'remaining'; 
} 

Nó trả "x <time> and y <time> remaining", cho 2 giá trị lớn nhất. (Hoặc chỉ cần vài giây trong trường hợp cuối cùng

+0

Cảm ơn Cerberus, tôi nghĩ làm một cái gì đó tương tự (mặc dù trong một vòng lặp qua mảng) nhưng nếu thời gian là lớn ví dụ 2 năm tôi muốn chỉ trở lại những năm, nhưng đối với thời lượng nhỏ hơn tôi muốn trở lại một số (3 phút và 42 giây). Tôi đã hy vọng moment.js đã xử lý điều này nhưng tôi đoán là không. – gordyr

+0

Hoàn hảo! Rất cám ơn sự giúp đỡ của bạn! – gordyr

+0

@gordyr: Không có vấn đề gì cả: D – Cerbrus

9

thư viện HumanizeDuration.js My có vẻ như chính xác những gì bạn muốn:.

humanizeDuration(1);   // "1 millisecond" 
humanizeDuration(3000);  // "3 seconds" 
humanizeDuration(2012);  // "2 seconds, 12 milliseconds" 
humanizeDuration(97320000); // "1 day, 3 hours, 2 minutes" 

Hình như câu trả lời của tôi là hơi muộn, nhưng có lẽ nó sẽ giúp những người khác nhìn vào câu hỏi này!

+0

Đó là một thư viện tuyệt vời mà bạn có! Lam tôt lăm! – raidenace

+0

+ 100 Cảm ơn rất nhiều – DogCoffee

2

Bạn nên đưa ra một thử trên plugin này: moment-duration-format

cú pháp của nó là rất thuận tiện:

var moment = require('moment'); 
require("moment-duration-format"); 
moment.duration(32832, "seconds").format("h [hrs]: m [min]: s [sec]") 
// => 9 hrs: 7 min: 12 sec" 
Các vấn đề liên quan