2013-01-12 51 views
18

Zaten Date.js'yi kullanın, ancak gerekirse başka bir kitaplık da kullanabilirsiniz.Javascript'te bir çalışma süresiyle çalışın

Saat deltalarıyla çalışmanın en iyi yolunun ne olduğundan emin değil. Özellikle, şimdiki zaman ile geçmiş bir tarih arasında geçen süreyi görüntülemek istiyorum.

Yani böyle bir şey yapmak gerekir: şimdi bir Date nesnesi değil, bir zaman aralığı, ile çalışıyorum

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

çoğunlukla Date.js kullanarak çalışmak için aldık, ama sorun yani ne

 
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 

Benim ihtiyacım olan:

01 bir 23 saatlik zaman dilimi 23 saat randevusu ilk süre sonra yerine ise olmalıdır

Herhangi bir fikrin var mı?

cevap

45

Eğer moment.js

örneğin ihtiyaç gibi geliyor

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

=> geçen Pazar at 08:23

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

=> 26 dakika önce

Düzenleme:

Saf JS tarih fark hesaplama:

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

Ben bunun geçen süreyi günler, saatler, saniye olarak basmayı desteklediğinden emin değil misiniz? –

+2

Evet, başka biri de ona baktı. Moment.js ile bile, zaman aralığında yeterli "format" seçeneği yoktur. Yapmamızın yolu, yukarıda olduğu gibi el ile yapıldı. –

+0

, moment.js'yi belirtmek için tamam, ancak verilen moment.js kodu OP'nin sorusunu nasıl yanıtlıyor? –

6

Eğer gün sonra doğruluk çok endişeli değiliz varsa, matematik

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

sonra timeSince(pastDate); basitçe yapabilir ve istediğiniz gibi özelliklerini kullanın.

Aksi bunu hesaplamak için .getUTC* kullanmak, ancak

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 böyle işlevsellik sağlar hesaplamak biraz daha yavaş olabilir not edebilirsiniz: Çok iyi belgelenmiş oluyor

http://momentjs.com/

ve güzel kütüphane.

O http://momentjs.com/docs/#/displaying/from/

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

Tüm belgeleri gözden geçirdim ve bazı deneme-yanılma yaptım. Moment.js ile nasıl yapılacağını anlayamadım Eğer moment.js ile nasıl yapılacağını gösterebilirseniz, bu harika olur. Diğer cevaplar elle nasıl yapıldığını gösterir, bundan kaçınmaya çalışıyorum. –

+0

Cevabı açıkladı ... umarım daha fazla ipucu verir. Bunu asla kendim yapmadım. –

+0

Bunun işe yaramadığından eminim. Bu "birkaç saniye önce" gibi bir şey çıktı gibi görünüyor. "HH: MM: SS" türü şeyler yazdırmak için söyleyemem. –

1

Sen momentjsduration nesne

Örnek kullanabilirsiniz API çizgileri "Süre" ve "insancıl boyunca gitmeli:

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

Kullanıcıların anlayabilmesi için yorumları İngilizce'ye çevirebilir misiniz? – Shiko