2013-01-12 30 views
18

已經使用Date.js,但如果需要也可以使用其他庫。使用Javascript中的時間跨度

不確定什麼是使用時間變化的最佳方式。具體來說,我想顯示從現在到過去的日期時間之間的時間。

所以我需要做這樣的事情:

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

得到它大多采用Date.js工作,但問題是我現在有一個Date對象,而不是一個時間跨度,工作等什麼應該是一個23小時時間跨度日期的第一次23小時後改爲:

 
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 

我需要的是:

 
0 days 23 hours 17 minutes and 32 seconds 

任何想法?

回答

45

聽起來像是你需要moment.js

例如

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

=>最後一個星期日在下午8點23分

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

=> 27分鐘前

編輯:

純JS日期差異計算:

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

我不確定這是否支持以天,小時,分鐘,秒來打印已用時間? –

+2

是的,有另一個人也看着它。即使使用moment.js,時間跨度上也沒有足夠的「格式」選項。我們不得不這樣做的手段就像上面那樣手動。 –

+0

可以提到moment.js,但給定的moment.js代碼如何回答OP的問題? –

6

如果你不是天太擔心的準確性,你可以簡單地做數學

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

然後timeSince(pastDate);和你喜歡使用屬性。

否則可以使用.getUTC*來計算的話,但要注意它可能會稍微慢計算

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提供了這樣的功能:

http://momentjs.com/

它是有據可查和漂亮的圖書館。

應該沿着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

我查看了整個文檔以及做了一些反覆試驗。我無法弄清楚如何用moment.js來做到這一點。如果你可以用moment.js來演示如何做到這一點,那真是太棒了。其他答案顯示瞭如何手動執行,這正是我試圖避免的。 –

+0

Clairified答案...希望給更多的線索。從來沒有做過這件事。 –

+0

我很確定這是行不通的。它似乎打印出「幾秒鐘前」這樣的內容。無法告訴它打印出「HH:MM:SS」類型的東西。 –

1

您可以使用momentjsduration對象

例子:

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

您能否將評論更改爲英文,以便人們可以添加理解。 – Shiko