2013-01-04 17 views
8

मेरे पास फ़ाइल अपलोड के लिए 'समय शेष' काउंटर है। शेष अवधि इतनी तरह गणना की जाती है और परिवर्तित मिलीसेकेंड में:मैं इस पूर्ण अवधि को कैसे पलट सकता हूं .js/javascript

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

मैं तो एक सरणी जो मैं एक humanized स्ट्रिंग में बनाने का इरादा निर्माण। सरणी इस प्रकार है:

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

यह सब काम करता है पूरी तरह से और अगर मैं उत्पादन तो जैसे इस डेटा के एक स्ट्रिंग प्रतिनिधित्व:

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

मैं यह इतना की तरह शेष समय का एक अच्छा सरल धारा देता है:

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

मुझे अब यह करने की आवश्यकता है कि इस आउटपुट को मानवकृत करें ताकि स्ट्रिंग शेष समय पर निर्भर हो। जैसे

  • 2 साल और 3 महीने शेष
  • 1 घंटा, 32 मिनट और 41 सेकंड शेष
  • 7 सेकंड शेष
  • 3 मिनट 46 सेकंड के शेष
  • 6 सेकंड शेष

आदि ... आदि ...

अब मुझे पता है कि मो ment.js में स्वचालित रूप से मानविकीकरण करने की क्षमता है जो एकल मानों के लिए ठीक काम करता है लेकिन इसमें कई संभावित मान (घंटे/मिनट/सेकंड इत्यादि) हो सकते हैं

मैं इस डेटा को पल.जेएस या मैन्युअल रूप से स्ट्रिंग का निर्माण?

अग्रिम धन्यवाद।

उत्तर

7

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव कुछ इस तरह होगा:

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

वैकल्पिक रूप से, आप इस सुविधा का उपयोग कर सकते हैं:

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

यह रिटर्न "x <time> and y <time> remaining", 2 बड़ा मूल्यों के लिए। पिछले मामले में (या केवल कुछ सेकंड

+0

धन्यवाद Cerberus, मैं (सरणी के माध्यम से एक पाश में हालांकि) ऐसी ही कुछ कर रही है के बारे में सोचा, लेकिन अगर अवधि 2 साल के लिए बड़ी है, मैं केवल वर्षों को वापस करना चाहता हूं, फिर भी छोटी अवधि के लिए मैं कई (3 मिनट और 42 सेकंड) वापस करना चाहता हूं। मैं पल की उम्मीद कर रहा था। जेएस पहले से ही इसे संभाला है, लेकिन मुझे नहीं लगता। – gordyr

+0

बिल्कुल सही! आपकी मदद के लिए बहुत धन्यवाद! – gordyr

+0

@gordyr: कोई समस्या नहीं: डी – Cerbrus

9

मेरे HumanizeDuration.js पुस्तकालय की तरह आप अपनी ज़रुरत लगता है:।

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

ऐसा लगता है कि मेरा उत्तर थोड़ी देर हो चुकी है, लेकिन शायद यह इस सवाल को देखकर दूसरों की मदद करेंगे!

+0

यह आपके पास एक शानदार पुस्तकालय है! अच्छा काम! – raidenace

+0

+ 100 बहुत बहुत धन्यवाद – DogCoffee

2

आप इस प्लगइन पर एक कोशिश देना चाहिए: moment-duration-format

इसका वाक्य रचना बहुत सुविधाजनक है:

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"