Moment.js - yarın, bugün ve dün


116

moment().fromNow()İşlevselliği istiyorum , ancak tarih yaklaştığında çok kesin - örn. Bunun "3 saat içinde" değil "bugün" gösterilmesini istemiyorum - yani temelde "günlük" bir hassasiyetle.

moment().calendar()Fonksiyonu kullanmayı denedim , tarih farkı 1 günden fazla ise biçimlendirmiyor

Yanıtlar:


120

Bunu bugün, yarın ve dünün tarihini almak için de yapabilirsiniz.

let today     = moment();

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

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

bu resmi api'de değil! lütfen bunun için sahip olduğunuz çoklu dolguyu sağlayın
Khaled Al-Ansari

buradaki belgelere bakın momentjs.com/docs/#/manipulating/add Eklediğim tek şey, lib'innew Date() bana sürekli olarak verdiği bir uyarıdan kaçınmaktır (bkz. momentjs.com/docs/#/parsing/now )
HussienK

8
olumsuz oy için üzgünüm, ama istediğim bu değildi. Bunun en çok oylanan cevap olmasına şaşırdım (yazarken) ...
Ziarno

8
Doğru, bunu gerçekten kendim ve sorunun başlığının nasıl ifade edildiğinden dolayı buraya gelebilecek başkaları için bir referans olarak ekledim. Pek çok insana yardımcı olmuş gibi görünüyor ki ben de mutluyum. :)
HussienK

2
Is new Date()gerekli? moment()Zaten bugünün tarihini kullanarak bir an örneği oluşturduğunu sanıyordum
Craig Myles

37

Hem yöntemlerin hem .fromNowde .calendaryöntemlerin tarihleri ​​kullanma şeklini özelleştirebilirsiniz moment.updateLocale. Aşağıdaki kod .calendar, soruya göre görüntülenme şeklini değiştirecektir :

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

Soruya dayanarak, .calendaryöntem daha uygun gibi görünüyor - .fromNowgeçmiş / şimdiki bir önek / son eke sahip olmak istiyor, ancak daha fazla bilgi edinmek isterseniz, http://momentjs.com adresindeki belgeleri okuyabilirsiniz. / docs / # / özelleştirme / göreli zaman / .

Bunu yerel ayarların üzerine yazmak yerine yalnızca bir yerde kullanmak için, ilk bağımsız değişken olarak seçtiğiniz bir dizeyi moment.updateLocaleiletin ve ardından bu yerel ayarı kullanarak takvim yöntemini çağırın (örn. moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ ))

DÜZENLEME: An ^ 2.12.0 artık updateLocalemetoda sahip. updateLocaleve localeişlevsel olarak aynı görünüyor ve localehenüz kullanımdan kaldırılmamış, ancak daha yeni yöntemi kullanmak için yanıtı güncelledi.


1
bu küresel yerelleştirmeyi değiştiriyor, buna sadece 1 yerde ihtiyacım var :)
Ziarno

Düzenlemeye bakın - mevcut yerel ayarların üzerine yazmak yerine özel yerel ayarlar oluşturabilirsiniz
svangordon

35

Ben bir arada kullanmak add()ve endOf()anı ile

//...
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

Gereksinimler:

  • Tarih daha uzaktaysa, standart moment().fromNow()işlevi kullanın .
  • Tarih olduğunda daha yakın, gösteri "today", "yesterday", "tomorrow"vb

Çözüm:

// 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 + "]";
        }
    });
}

Not: 2.14.0 sürümünden itibaren, takvim işlevinin biçimler bağımsız değişkeni bir geri arama olabilir, bkz. Http://momentjs.com/docs/#/displaying/calendar-time/ .


19

Bunu kullanabilirsiniz:


const today     = moment();

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

const yesterday = moment().subtract(1, 'days');

12

Benzer bir çözümüm var, ancak yerel ayarları kullanmaya izin veriyor:

    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'

çalışır, ancak '> = 2' için '> = 1' değiştirirseniz, '1 gün önce' yerine 'dün' dizesini alırsınız.
Dody

10

2.10.5 andan itibaren, çağrı başına takvim çıktı biçimlerini belirlemeyi destekler Daha ayrıntılı dokümantasyon için Moment - Calendar'ı kontrol edin .

**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'dan itibaren takvim, değerleri döndürmek için bir geri arama alabilir.

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

neden olumsuz oylar? Bunu iyileştirebilmem için bana haber ver
18:57

Cevap bu.
oscarteg

bence doğru cevap bu. Ancak, yüksek düzeyde özelleştirilmediği sürece "3 gün önce" türü sonucu yine de döndürmez
Zortext

9

Moment.js'de from () yöntemi, aradığınız günlük kesinliğe sahiptir:

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
teşekkürler, ancak yine de 'bugün' görüntülenmiyor ve eski olarak görüntüleniyor. "Dün" yerine "1 gün önce" - ihtiyacım olan işlevselliğin özel olması gerekiyor gibi görünüyor
Ziarno

1
fromgerçekten günlük hassasiyete sahip değil. Örneğin, dün dört saat önceyse ve beş saat önceki bir zamanı seçersem, dün yerine "5 saat önce" yazacaktır. Bu çözümün kesinliği ile hiçbir ilgisi yok from, ancak geçen tarihler.
Michael Mior

5

Bu yüzden sonunda yaptığım şey bu

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

Bende de aynı sorun var, ancak i18n uygulamam gerekiyor ve 10 dilim var ... bu yüzden şu an JS'nin uluslararasılaşmasına güveniyordum ...
Chexpir

3

Dün ve yarın tarihi almak için .add () ve .subtract () yöntemlerini kullanabilirsiniz. Ardından, yalnızca tarih .format ("G / A / Y"), Gün için D, Ay için M, Yıl için Y almak için biçim yöntemini kullanın. Moment Belgelerini Kontrol Et

 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");

Sonuç şu şekilde olacaktır:

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

3

İşte anı kullanarak bunu nasıl yapıyorum :

  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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.