2013-01-04 15 views
8

Mam do dyspozycji "licznik czasu pozostałego do przesłania plików". Pozostały czas oblicza się i przekształca w milisekundach tak:Jak można uczłowieczyć ten całkowity czas trwania w chwili.js/javascript

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

Następnie zbudować układ które zamierza wbudować humanizowanego łańcucha. Tablica przedstawia się następująco:

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

To wszystko działa idealnie, a jeśli wyjście I reprezentację ciąg tych danych tak:

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

I zwraca piękny prosty strumień czasu pozostałego tak:

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

Co ja teraz trzeba zrobić, to uczłowieczyć to wyjście tak, że łańcuch zbudowany jest zależne od pozostałego czasu. np

  • 2 lata i 3 miesiące pozostałe
  • 1 godzinę, 32 minut i 41 sekund pozostałego
  • 7 sekund pozostałego
  • 3 minuty 46 sekund pozostałego
  • 6 sekund pozostałego

itd ... itd.

Teraz wiem, że mo ment.js ma zdolność automatycznego humanizowania czasu trwania, który działa dobrze dla pojedynczych wartości, ale może mieć wiele możliwych wartości (godziny/minuty/sekundy itp.).

Jak mogę humanizować te dane za pomocą pliku moment.js lub ręcznie budujesz ciąg?

Z góry dziękuję.

Odpowiedz

7

Myślę, że najlepiej byłoby coś takiego:

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

Alternatywnie, można użyć tej funkcji:

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

Zwraca "x <time> and y <time> remaining", dla 2 największych wartości. (albo tylko sekundy w ostatnim przypadku

+0

Dzięki Cerberus, myślałem, że robi coś podobnego (choć w pętli za pośrednictwem tablicy), ale jeśli czas trwania jest duży, na przykład 2 lata Chciałbym tylko zwrócić lata, jednak w krótszych okresach chciałbym zwrócić kilka (3 minuty i 42 sekundy). Miałem nadzieję, że moment.js już to załatwił, ale chyba nie. – gordyr

+0

Idealny! Ogromne dzięki za pomoc! – gordyr

+0

@gordyr: Żaden problem: D – Cerbrus

9

Moja HumanizeDuration.js biblioteka brzmi jak dokładnie, co chcesz.

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

Wygląda jak moja odpowiedź jest trochę późno, ale może to pomoże innym patrząc na to pytanie!

+0

To jest niesamowita biblioteka, którą tam masz! Dobra robota! – raidenace

+0

+ 100 Dziękuję bardzo – DogCoffee

2

Należy spróbować na tej wtyczki: moment-duration-format

jego składnia jest bardzo wygodne:

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" 
Powiązane problemy