2013-01-12 21 views
18

Utilizzare Date.js già, ma è anche possibile utilizzare un'altra libreria, se necessario.Lavoro con un intervallo di tempo in Javascript

Non so quale sia il modo migliore per lavorare con delta temporali. Nello specifico, voglio visualizzare il tempo trascorso tra ora e una data-ora passata.

quindi ho bisogno di fare qualcosa di simile:

var elapsed_time = new Date() - pastDate; 
pastDate.toString('days-hours-minutes-seconds'); 

ottenuto di lavorare in gran parte utilizzando Date.js, ma il problema è ora sto lavorando con un oggetto Date e non un periodo, così che cosa dovrebbe essere un arco di tempo 23 ore invece di 23 ore dopo la prima volta del Data:

 
var result = (new Date()) - past_date; 
"result" is the number (probably milliseconds): 15452732 
 
var result = (new Date() - past_date 
"result" is a date from 1969: Wed Dec 31 1969 23:17:32 

cosa ho bisogno è:

 
0 days 23 hours 17 minutes and 32 seconds 

Qualche idea?

risposta

45

Sembra che avete bisogno moment.js

esempio

moment().subtract('days', 6).calendar(); 

=> Domenica scorsa alle 08:23

moment().startOf('hour').fromNow(); 

=> 26 minuti fa

Edit:

puro calcolo JS Data diff:

var date1 = new Date("7/Nov/2012 20:30:00"); 
 
var date2 = new Date("20/Nov/2012 19:15:00"); 
 

 
var diff = date2.getTime() - date1.getTime(); 
 

 
var days = Math.floor(diff/(1000 * 60 * 60 * 24)); 
 
diff -= days * (1000 * 60 * 60 * 24); 
 

 
var hours = Math.floor(diff/(1000 * 60 * 60)); 
 
diff -= hours * (1000 * 60 * 60); 
 

 
var mins = Math.floor(diff/(1000 * 60)); 
 
diff -= mins * (1000 * 60); 
 

 
var seconds = Math.floor(diff/(1000)); 
 
diff -= seconds * (1000); 
 

 
document.write(days + " days, " + hours + " hours, " + mins + " minutes, " + seconds + " seconds");

+0

Sono non è sicuro che questo supporti la stampa del tempo trascorso in giorni, ore minuti, secondi? –

+2

Sì, ha avuto anche un altro ragazzo. Anche con moment.js, non ci sono abbastanza opzioni di "formato" sull'intervallo di tempo. Il modo in cui dovevamo farlo era manualmente come hai sopra. –

+0

ok per citare moment.js, ma come fa il dato codice moment.js a rispondere alla domanda dell'OP? –

6

Se non siete troppo preoccupati della precisione dopo giorni, si può semplicemente fare la matematica

function timeSince(when) { // this ignores months 
    var obj = {}; 
    obj._milliseconds = (new Date()).valueOf() - when.valueOf(); 
    obj.milliseconds = obj._milliseconds % 1000; 
    obj._seconds = (obj._milliseconds - obj.milliseconds)/1000; 
    obj.seconds = obj._seconds % 60; 
    obj._minutes = (obj._seconds - obj.seconds)/60; 
    obj.minutes = obj._minutes % 60; 
    obj._hours = (obj._minutes - obj.minutes)/60; 
    obj.hours = obj._hours % 24; 
    obj._days = (obj._hours - obj.hours)/24; 
    obj.days = obj._days % 365; 
    // finally 
    obj.years = (obj._days - obj.days)/365; 
    return obj; 
} 

quindi timeSince(pastDate); e utilizzare le proprietà come ti piace.

Altrimenti è possibile utilizzare .getUTC* per calcolarlo, ma è da notare che potrebbe essere leggermente più lento per calcolare

function timeSince(then) { 
    var now = new Date(), obj = {}; 
    obj.milliseconds = now.getUTCMilliseconds() - then.getUTCMilliseconds(); 
    obj.seconds = now.getUTCSeconds() - then.getUTCSeconds(); 
    obj.minutes = now.getUTCMinutes() - then.getUTCMinutes(); 
    obj.hours = now.getUTCHours() - then.getUTCHours(); 
    obj.days = now.getUTCDate() - then.getUTCDate(); 
    obj.months = now.getUTCMonth() - then.getUTCMonth(); 
    obj.years = now.getUTCFullYear() - then.getUTCFullYear(); 
    // fix negatives 
    if (obj.milliseconds < 0) --obj.seconds, obj.milliseconds = (obj.milliseconds + 1000) % 1000; 
    if (obj.seconds < 0) --obj.minutes, obj.seconds = (obj.seconds + 60) % 60; 
    if (obj.minutes < 0) --obj.hours, obj.minutes = (obj.minutes + 60) % 60; 
    if (obj.hours < 0) --obj.days, obj.hours = (obj.hours + 24) % 24; 
    if (obj.days < 0) { // months have different lengths 
     --obj.months; 
     now.setUTCMonth(now.getUTCMonth() + 1); 
     now.setUTCDate(0); 
     obj.days = (obj.days + now.getUTCDate()) % now.getUTCDate(); 
    } 
    if (obj.months < 0) --obj.years, obj.months = (obj.months + 12) % 12; 
    return obj; 
} 
0

Moment.js fornisce tale funzionalità:

http://momentjs.com/

E 'ben documentato e bella biblioteca.

Dovrebbe andare lungo le linee "durata" e "umanizzare di API http://momentjs.com/docs/#/displaying/from/

var d1, d2; // Timepoints 
var differenceInPlainText = moment(a).from(moment(b), true); // Add true for suffixless text 
+0

Ho esaminato l'intera documentazione e ho fatto alcuni tentativi ed errori. Non riuscivo a capire come farlo con moment.js Se puoi mostrare come farlo con moment.js, sarebbe fantastico. Le altre risposte mostrano come farlo manualmente, che è quello che stavo cercando di evitare. –

+0

Chiarito la risposta ... si spera che dia più indizi. Non l'ho mai fatto io. –

+0

Sono abbastanza sicuro che non funzioni. Sembra stampare qualcosa di simile a "pochi secondi fa". Non posso dire di stampare "HH: MM: SS". –

1

È possibile utilizzare momentjsduration oggetto

Esempio:

const diff = moment.duration(Date.now() - new Date(2010, 1, 1)) 
console.log(`${diff.years()} years ${diff.months()} months ${diff.days()} days ${diff.hours()} hours ${diff.minutes()} minutes and ${diff.seconds()} seconds`) 
0
/** 
* 计算时间对象与当前时间的差距,并显示友好的文本 
*/ 
function date2Text(date) { 
    var milliseconds = new Date() - date; 
    var timespan = new TimeSpan(milliseconds); 
    if (milliseconds < 0) { 
     return timespan.toString() + "之后"; 
    }else{ 
     return timespan.toString() + "前"; 
    } 
} 

/** 
* 用于计算时间间隔的对象 
* @param milliseconds 毫秒数 
*/ 
var TimeSpan = function (milliseconds) { 
    milliseconds = Math.abs(milliseconds); 
    var days = Math.floor(milliseconds/(1000 * 60 * 60 * 24)); 
    milliseconds -= days * (1000 * 60 * 60 * 24); 

    var hours = Math.floor(milliseconds/(1000 * 60 * 60)); 
    milliseconds -= hours * (1000 * 60 * 60); 

    var mins = Math.floor(milliseconds/(1000 * 60)); 
    milliseconds -= mins * (1000 * 60); 

    var seconds = Math.floor(milliseconds/(1000)); 
    milliseconds -= seconds * (1000); 
    return { 
     getDays: function() { 
      return days; 
     }, 
     getHours: function() { 
      return hours; 
     }, 
     getMinuts: function() { 
      return mins; 
     }, 
     getSeconds: function() { 
      return seconds; 
     }, 
     toString: function() { 
      var str = ""; 
      if (days > 0 || str.length > 0) { 
       str += days + "天"; 
      } 
      if (hours > 0 || str.length > 0) { 
       str += hours + "小时"; 
      } 
      if (mins > 0 || str.length > 0) { 
       str += mins + "分钟"; 
      } 
      if (days == 0 && (seconds > 0 || str.length > 0)) { 
       str += seconds + "秒"; 
      } 
      return str; 
     } 
    } 
} 
+0

Potresti cambiare i commenti in inglese in modo che le persone possano aggiungere capire. – Shiko

Problemi correlati