Moment.js - jutro, dziś i wczoraj


116

Chciałbym moment().fromNow() funkcjonalność, ale kiedy zbliża się termin, jest zbyt precyzyjny - np. Nie chcę, żeby wyświetlało się „za 3 godziny”, ale „dzisiaj” - czyli w zasadzie z „codzienną” precyzją.

Próbowałem użyć tej moment().calendar()funkcji, nie formatuje, jeśli różnica dat jest większa niż 1 dzień

Odpowiedzi:


120

Możesz to również zrobić, aby uzyskać datę na dziś, jutro i wczoraj

let today     = moment();

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

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

tego nie ma w oficjalnym api! proszę podać wypełnienie, które masz do tego
— Khaled Al-Ansari

zobacz dokumentację tutaj momentjs.com/docs/#/manipulating/add Jedyną rzeczą, którą dodam, jest new Date()uniknięcie ostrzeżenia, które wyświetla mi biblioteka (patrz momentjs.com/docs/#/parsing/now )
— HussienK

8
przepraszam za głosowanie przeciw, ale nie o to prosiłem. Dziwię się, że jest to najczęściej głosowana odpowiedź (w momencie pisania) ...
— Ziarno,

8
To prawda, naprawdę dodałem to jako odniesienie dla siebie i innych, którzy mogą tu trafić ze względu na sposób sformułowania tytułu pytania. Wygląda na to, że pomogło to wielu ludziom, z czego jestem zadowolony. :)
— HussienK

2
Czy jest to new Date()wymagane? Pomyślałem, że i tak moment()wygenerowałem moment przy użyciu dzisiejszej daty
— Craig Myles

37

Możesz dostosować sposób, w jaki obie metody .fromNowi .calendarmetody wyświetlają daty przy użyciu moment.updateLocale. Poniższy kod zmieni sposób .calendarwyświetlania zgodnie z pytaniem:

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

Na podstawie pytania wydaje się, że .calendarmetoda byłaby bardziej odpowiednia - .fromNowchce mieć poprzedni / obecny prefiks / sufiks, ale jeśli chcesz dowiedzieć się więcej, możesz przeczytać dokumentację na http://momentjs.com / docs / # / customization / względny czas / .

Aby użyć tego tylko w jednym miejscu, zamiast nadpisywać ustawienia regionalne, przekaż wybrany przez siebie ciąg jako pierwszy argument podczas definiowania, moment.updateLocalea następnie wywołaj metodę kalendarza przy użyciu tych ustawień regionalnych (np. moment.updateLocale('yesterday-today').calendar( /* moment() or whatever */ ))

EDYCJA: Moment ^ 2.12.0 ma teraz updateLocalemetodę. updateLocalei localewydają się funkcjonalnie takie same i localenie są jeszcze przestarzałe, ale zaktualizowałem odpowiedź, aby używać nowszej metody.


1
to zmienia globalną lokalizację, po prostu potrzebuję tego w 1 miejscu :)
— Ziarno

Zobacz edycję - możesz tworzyć własne ustawienia regionalne zamiast nadpisywać istniejące
— svangordon

35

Używam kombinacji add()i endOf()chwili

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

Wymagania:

  • Gdy data jest dalej, skorzystaj ze standardowej moment().fromNow()funkcjonalności.
  • Jeżeli data jest bliżej, show "today", "yesterday", "tomorrow", itd.

Rozwiązanie:

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

NB: Od wersji 2.14.0 argument formatów funkcji kalendarza może być wywołaniem zwrotnym, patrz http://momentjs.com/docs/#/displaying/calendar-time/ .


19

Możesz użyć tego:


const today     = moment();

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

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

12

Mam podobne rozwiązanie, ale pozwala na użycie lokalizacji:

    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'

to działa, ale jeśli zmienisz „> = 1” na „> = 2”, otrzymasz ciąg „wczoraj” zamiast „1 dzień temu”.
— Dody

10

Od 2.10.5 moment obsługuje określanie formatów wyjściowych kalendarza na wywołanie. Aby uzyskać bardziej szczegółową dokumentację, sprawdź Moment - Kalendarz .

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

Od 2.14.0 kalendarz może również przyjmować wywołanie zwrotne w celu zwrócenia wartości.

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

dlaczego głosy przeciw? Niech mi więc wiem, że mogę poprawić ten ans
— Pravin

To jest odpowiedź.
— oscarteg

myślę, że to jest poprawna odpowiedź. Ale nadal nie zwraca wyniku typu „3 dni temu”, chyba że jest wysoce dostosowany
— Zortext

9

W Moment.js metoda from () ma codzienną precyzję, której szukasz:

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
dzięki, ale nadal nie wyświetla „dzisiaj” i wyświetla np. „1 dzień temu” zamiast „wczoraj” - wygląda na to, że potrzebna mi funkcjonalność ma być niestandardowa
— Ziarno

1
fromtak naprawdę nie ma codziennej precyzji. Na przykład, jeśli wczoraj było cztery godziny temu i wybiorę godzinę sprzed pięciu godzin, zamiast wczoraj zostanie wyświetlone „5 godzin temu”. To rozwiązanie nie ma nic wspólnego z precyzją from, ale z
— podanymi

5

Więc to właśnie zrobiłem

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

Mam ten sam problem, ale muszę zastosować i18n, a mam 10 języków ... więc polegałem na momencie umiędzynarodowieniaJS ...
— Chexpir

3

Możesz użyć metod .add () i .subtract (), aby uzyskać datę wczorajszą i jutrzejszą. Następnie użyj metody formatowania, aby uzyskać tylko format daty („D / M / R”), D oznacza dzień, M - miesiąc, Y - rok. Sprawdź w Moment Docs

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

Wynik będzie:

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

3

Oto jak to robię za pomocą momentu :

  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]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.