2015-09-06 3 views
10

私はmoment.calendar()オプションを時間なしで使用したいと思っています... の代わりに "最後の火曜日の午後5時" "最後の火曜日"が欲しいです。 誰かが瞬間が解決策を持っているかどうか分かりますか? 私はこのフィドルを見つけましたhttp://jsfiddle.net/nawxZ/、それは明らかにそれのための解決策を示していますが、私はこれがどのように動作するはずですか? おかげ カールtime.calendar()なし時間

function log(str) { 
    $('body').append('<p>' + str + '</p>'); 
} 

log(moment().calendar()); 
log(moment().calendar(true)); 

答えて

3

moment().calendar()は、カスタム書式設定文字列と書式設定機能をサポートしています。

moment().calendar(); 
>> "Today at 9:06 AM" 

はその後トリックを行う必要があり、あなたのフォーマットされた文字列

moment.locale('yourlang', { 
    calendar: { 
     lastDay: function() { 
      return '[last]'; 
     }, 
     sameDay: function() { 
      return '[Today]'; 
     } 
    } 
}); 

moment().calendar(); 

// Will now output 
>> "Today" 

を設定します。 The docs are an invaluable source

+0

を(完全な日はいつも午後12時timetagと一緒に保存されている)..:/ – Luckylooke

+0

3年前のケースになること - 私は今日の仕組みがわからない! –

+0

今日は同じケースのようです:/ – Luckylooke

0

私はカレンダーに日付のみを提供する角度指令を作成しました。 角度を使用しない場合は、関数を使用してください。

app.filter('amCalendarDate', function($translate) { 
    return function(dt) { 
     var md = moment(dt), key = ''; 

     if (!dt || !md || (md + '').toLowerCase() == 'invalid date') 
      return ''; 

     var today = moment(); 
     var diff = today.diff(md, 'days'); 

     if (!diff) 
      key = 'Today'; 
     else if (diff == -1) 
      key = 'Tomorrow'; 
     else if (diff == 1) 
      key = 'Yesterday'; 
     else if (Math.abs(diff) <= 6) { 
      if (diff < 0) 
       key = 'Next'; 
      else 
       key = 'Last'; 

      var days = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); 

      today.day(diff); 

      key += ' ' + days[today.day()]; 
     } 

     if (key) { 
      // if you don't have translate, just return the key 
      return $translate.amCalendarDate[key]; 
     } else 
      return md.format('L'); 
    } 
}); 
10

あなたが行うことができた瞬間2.10.5から始まる:

moment(/*your date*/).calendar(null,{ 
    lastDay : '[Yesterday]', 
    sameDay : '[Today]', 
    nextDay : '[Tomorrow]', 
    lastWeek : '[last] dddd', 
    nextWeek : 'dddd', 
    sameElse : 'L' 
}) 

参照:これは完全に働いているhttp://momentjs.com/docs/#/displaying/calendar-time/

+0

これはどのようにローカライズできますか?ロケール "en"の "Today"、ロケール "de"の "Heute"を取得しますか?ありがとう – Luckylooke

+0

モーメントは既にすべての翻訳がmoment.lang( "de")を使用してロケールを変更しています –

+0

私は行いましたが、結果は翻訳されていないので、 'dddd'部分のみが翻訳されています。 [今日]は、動的ではない静的テキストとしてローカライズされています。これをチェック:https://github.com/moment/moment/issues/4439 – Luckylooke

6

。それを試してみてください。

(モーメント(時間).calendar()。スプリット()「で」)[0]

+1

ありがとう! 他のロケールに切り替える場合は、 (moment()。calendar()。split( ""))[0] の代わりに などを使用する必要があります。 "Aujourd'huià16:30"(fr)または "heute um 16:30 Uhr"(de)は他のロケールでは動作しません。 – CREOFF

+0

@CREOFF一部のロケールでは修正されていません。いくつかのロケールは今週の将来の日に2つの言葉を持っています。たとえばロケール 'sk'では、 'Voštvrtoko 15:30'は '木曜日15:30に'を意味します。 – Luckylooke

+0

@Luckylookeはい、サポートしたいすべてのロケールのロジックをチェックする必要があります。言語が多いほど、スクリプトのインテリジェント化が必要です。ベルギーのサイトは通常NL、FR、DE、ENに限定されているため、テストが簡単です – CREOFF

0

カスタム時間が設定されていませんし、一日ベースで作業している場合、あなたはこれを使用することができますシンプルでマルチラング(EN/DE/FR/ITのテスト済み)ソリューションです。私はアプリのサポートされているすべての言語のカレンダーを定義する必要があなたのソリューションで

let dateParts = moment(DATE).calendar().split(' '), 
    index = dateParts.indexOf('00:00'); 

// ['Yesterday', 'at', '00:00', 'PM'] -> ['Yesterday'] 
dateParts.length = (index !== -1 ? (index - 1) : dateParts.length); 
関連する問題