Moment.js-明日、今日、昨日


115

私が欲しいmoment().fromNow()機能が、日が近づいたときに、それはあまりにも正確である-元。「3時間以内」ではなく「今日」を表示したくないので、基本的に「毎日」の精度で表示します。

moment().calendar()関数を使用してみましたが、日付の差が1日を超えるとフォーマットされません

回答:


119

これを実行して、今日と明日と昨日の日付を取得することもできます

let today     = moment();

let tomorrow  = moment().add(1,'days');

let yesterday = moment().add(-1, 'days');

これは公式APIではありません!このためのポリフィルを提供してください
Khaled Al-Ansari

ここのドキュメントを参照してくださいmomentjs.com/docs/#/manipulating/add追加する唯一のものはnew Date()、libが常に表示する警告を回避することです(momentjs.com/docs/#/parsing/nowを参照)
HussienK

8
反対票を投じて申し訳ありませんが、これは私が求めたものではありません。それが(執筆の時点で)トップ投票の回答であることに驚いています...
Ziarno

8
それは本当です。質問のタイトルがどのように語られているかで、私自身とここにたどり着くかもしれない他の人たちのために参考文献として本当にそれを追加しました。それは多くの人々を助けたように見えます、それは私が嬉しいです。:)
HussienK 2018

2
されるnew Date()必要?moment()とにかく今日の日付を使用して瞬間のインスタンスを生成したと思った
クレイグマイルズ

37

.fromNow.calendarを使用して日付を表示する方法をカスタマイズできmoment.updateLocaleます。次のコードは.calendar、質問に従って表示する方法を変更します。

moment.updateLocale('en', {
    calendar : {
        lastDay : '[Yesterday]',
        sameDay : '[Today]',
        nextDay : '[Tomorrow]',
        lastWeek : '[Last] dddd',
        nextWeek : '[Next] dddd',
        sameElse : 'L'
    }
});

質問に基づいて、.calendar方法はより適切であるようです- .fromNow過去/現在のプレフィックス/サフィックスが必要ですが、詳細を知りたい場合は、http://momentjs.comでドキュメントを読むことができます/ docs /#/ customization / relative-time /

あなたが定義するときにロケールを上書きするのではなく、一つだけの場所でこれを使用するには、最初の引数としてお好みの文字列を渡すmoment.updateLocaleと、そのロケールを使用して、カレンダー法呼び出し(例えば。moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ )

編集:モーメント^ 2.12.0にupdateLocaleメソッドが追加されました。updateLocaleそしてlocale機能的に同じであるように見える、とlocaleまだ非推奨が、新しいメソッドを使用するための答えを更新されません。


1
これはグローバルなローカリゼーションを変更します。これが1か所で必要です:)
Ziarno

編集を参照-既存のロケールを上書きする代わりにカスタムロケールを作成できます
svangordon

35

私は瞬間add()との組み合わせを使用endOf()します

//...
const today = moment().endOf('day')
const tomorrow = moment().add(1, 'day').endOf('day')

if (date < today) return 'today'
if (date < tomorrow) return 'tomorrow'
return 'later'
//...

21

要件:

  • 日付が離れている場合は、標準moment().fromNow()機能を使用してください。
  • 日が近い場合には、表示し"today""yesterday""tomorrow"など、

解決:

// call this function, passing-in your date
function dateToFromNowDaily( myDate ) {

    // get from-now for this date
    var fromNow = moment( myDate ).fromNow();

    // ensure the date is displayed with today and yesterday
    return moment( myDate ).calendar( null, {
        // when the date is closer, specify custom values
        lastWeek: '[Last] dddd',
        lastDay:  '[Yesterday]',
        sameDay:  '[Today]',
        nextDay:  '[Tomorrow]',
        nextWeek: 'dddd',
        // when the date is further away, use from-now functionality             
        sameElse: function () {
            return "[" + fromNow + "]";
        }
    });
}

注意:バージョン2.14.0以降、カレンダー関数のフォーマット引数をコールバックにすることができます。http://momentjs.com/docs/#/displaying/calendar-time/を参照してください



11

私は同様の解決策を持っていますが、ロケールを使用できます:

    let date = moment(someDate);
    if (moment().diff(date, 'days') >= 1) {
        return date.fromNow(); // '2 days ago' etc.
    }
    return date.calendar().split(' ')[0]; // 'Today', 'yesterday', 'tomorrow'

動作しますが、「> = 1」を「> = 2」に変更すると、「1日前」ではなく「yesterday」という文字列が返されます。
ドディ

10

2.10.5以降は、呼び出しごとのカレンダー出力形式の指定をサポートしています。詳細なドキュメントについては、モーメント-カレンダーを確認してください。

**Moment 2.10.5**
moment().calendar(null, {
  sameDay: '[Today]',
  nextDay: '[Tomorrow]',
  nextWeek: 'dddd',
  lastDay: '[Yesterday]',
  lastWeek: '[Last] dddd',
  sameElse: 'DD/MM/YYYY'
});

2.14.0以降、カレンダーは値を返すためにコールバックを取ることもできます。

**Moment 2.14.0**
    moment().calendar(null, {
     sameDay: function (now) {
       if (this.isBefore(now)) {
         return '[Will Happen Today]';
       } else {
        return '[Happened Today]';
       }
       /* ... */
      }
    });

なぜ反対票?このansを改善できるように
お知らせください

これが答えです。
oscarteg 2018年

これが正解だと思います。ただし、高度にカスタマイズされていない限り、「3日前」のタイプの結果は返されません
Zortext

9

Moment.jsでは、from()メソッドには、求めている毎日の精度があります。

var today = new Date();
var tomorrow = new Date();
var yesterday = new Date();
tomorrow.setDate(today.getDate()+1);
yesterday.setDate(today.getDate()-1);

moment(today).from(moment(yesterday)); // "in a day"
moment(today).from(moment(tomorrow)); // "a day ago" 

moment(yesterday).from(moment(tomorrow)); // "2 days ago" 
moment(tomorrow).from(moment(yesterday)); // "in 2 days"

2
ありがとう、しかしそれはまだ「今日」を表示せず、exを表示します。「昨日」ではなく「1日前」-必要な機能をカスタマイズする必要があるようです
Ziarno

1
from実際には毎日の精度はありません。たとえば、昨日が4時間前で、5時間前の時間を選択した場合、昨日の代わりに「5時間前」と表示されます。このソリューションは、精度とは何の関係もありませんfromが、渡された日付の。
マイケル・MIOR

5

これが私がやったことです

var dateText = moment(someDate).from(new Date());
var startOfToday = moment().startOf('day');
var startOfDate = moment(someDate).startOf('day');
var daysDiff = startOfDate.diff(startOfToday, 'days');
var days = {
  '0': 'today',
  '-1': 'yesterday',
  '1': 'tomorrow'
};

if (Math.abs(daysDiff) <= 1) {
  dateText = days[daysDiff];
}

同じ問題がありますが、i18nを適用する必要があり、10の言語があります...そのため、私はmomentJSの国際化に依存していました...
Chexpir

3

.add()および.subtract()メソッドを使用して、昨日と明日の日付を取得できます。次に、formatメソッドを使用して日付のみを取得します。.format( "D / M / Y")、Dは日を表し、Mは月を表し、Yは年を表します。モーメントドキュメントをチェックイン

 let currentMilli = Date.now()
 let today = Moment(currentMilli).format("D/M/Y");
 let tomorrow = Moment(currentMilli).add(1, 'days').format("D/M/Y");
 let yesterday = Moment(currentMilli).subtract(1, 'days').format("D/M/Y");

結果は次のようになります。

Current Milli - 1576693800000
today - 19/12/2019
tomorrow - 18/12/2019
yesterday - 18/12/2019

3

以下は、モーメントを使用してそれを行う方法です。

  let today = moment().format('DD MMMM YYYY');

  let tomorrow = moment().add(1, 'days').format('DD MMMM YYYY').toString();

  let yesterday = moment().subtract(1, 'days').startOf('day').format('DD MMMM YYYY').toString();

1
const date = moment(YOUR_DATE)
return (moment().diff(date, 'days') >= 2) ? date.fromNow() : date.calendar().split(' ')[0]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.