2013-01-12 5 views
18

既にDate.jsを使用していますが、必要に応じて別のライブラリを使用することもできます。JavaScriptでタイムスパンを使用する

時間デルタを使用する最も良い方法はわかりません。具体的には、現在と過去の日時の間に経過した時間を表示するとします。

は、だから私はこのような何かを実行する必要があります。今、私はDateオブジェクトではなくタイムスパン、で働いている

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

はほとんどDate.jsを使用して動作するようにそれを頂いたが、問題があるので、どのような

 
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 

私は必要なものです::

01 23時間のスパンであるべきことは日の非常に最初の時間は、23時間後の代わりにあります

答えて

45

あなたはmoment.js

例えばを必要とするような音

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

=>最後の日曜日の20:23

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

=> 26分前

編集:

ピュア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

することは、日後に精度があまりにも心配していないなら、あなたは単にtimeSince(pastDate);その後、数学

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

を行うことができますし、あなたが好きなようにプロパティを使用します。

それ以外のあなたはそれを計算するために.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/

これはよく文書化されます素晴らしいライブラリー。

それはあなたがmomentjsdurationオブジェクト

例使用することができますライン "期間" に沿って行くと、「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

答えを明確にしました...うまくいけば、もっと手がかりを与えます。これは決して自分ではできません。 –

+0

私はそれがうまくいかないと確信しています。これは "数秒前"のようなものを印刷するようです。 「HH:MM:SS」タイプのものを印刷するように指示することはできません。 –

1

必要があります:私は

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

関連する問題