2013-01-12 5 views
18

Verwendung von Date.js bereits, kann aber auch eine andere Bibliothek verwenden, falls erforderlich.Arbeiten mit einer Zeitspanne in Javascript

Nicht sicher, was der beste Weg ist, mit Zeitdeltas zu arbeiten. Insbesondere möchte ich die Zeit anzeigen, die zwischen jetzt und einem vergangenen Datum-Uhrzeit verstrichen ist.

Also brauche ich so etwas wie dies zu tun:

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

es Gotten meist arbeiten Date.js verwenden, aber das Problem ist, jetzt bin ich mit einem Date-Objekt und kein Zeitspanne arbeiten, so was sollte eine 23 Stunden Zeitspanne sein, anstatt 23 Stunden nach dem Zeitpunkt der sehr ersten Mal: ​​

 
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 

Was ich brauche, ist:

 
0 days 23 hours 17 minutes and 32 seconds 

Irgendwelche Ideen?

Antwort

45

Klingt wie Sie moment.js

zum Beispiel brauchen

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

=> letzten Sonntag um 8:23 Uhr

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

=> 26 Minuten vor

Edit:

reine JS Datum diff Berechnung:

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

Ich bin nicht sicher, dass dies das Ausdrucken der verstrichenen Zeit in Tagen, Stunden Minuten, Sekunden unterstützt? –

+2

Ja, hat sich noch ein anderer Kerl darum gekümmert. Selbst mit moment.js gibt es nicht genügend "Format" -Optionen für die Zeitspanne. Die Art, wie wir es tun mussten, war manuell wie oben. –

+0

ok, um moment.js zu erwähnen, aber wie beantwortet der angegebene moment.js Code die Frage des OP? –

6

Wenn Sie nach Tagen in der Genauigkeit nicht allzu besorgt sind, können Sie einfach tun die Mathematik

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

dann timeSince(pastDate); und verwenden, um die Eigenschaften, wie Sie möchten.

Ansonsten können Sie .getUTC* verwenden es zu berechnen, aber beachten Sie, es etwas langsamer sein kann

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 bietet eine solche Funktionalität zu berechnen:

http://momentjs.com/

Es ist gut dokumentiert und nette Bibliothek.

Es sollte entlang der Linien "Dauer" gehen und „Humanize von 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

Ich habe die gesamte Dokumentation durchgesehen und einige Versuche durchgeführt. Ich konnte mit moment.js nicht herausfinden, wie es geht. Wenn du zeigen kannst, wie es mit moment.js geht, wäre das großartig. Die anderen Antworten zeigen, wie man es manuell macht, was ich zu vermeiden versuchte. –

+0

Clairified die Antwort ... gibt hoffentlich mehr Hinweise. Habe das nie selbst gemacht. –

+0

Ich bin mir ziemlich sicher, dass das nicht funktioniert. Es scheint so etwas "vor ein paar Sekunden" auszudrucken. Kann es nicht sagen, um "HH: MM: SS" -Typ Zeug zu drucken. –

1

Sie momentjsduration Objekt

Beispiel verwenden können:

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

Könnten Sie bitte die Kommentare auf Englisch ändern, damit die Leute das verstehen können. – Shiko