2016-02-16 16 views
21

Chciałbym funkcji moment().fromNow(), ale gdy data jest blisko jest zbyt precyzyjne - np. Nie chcę, aby wyświetlała się "w ciągu 3 godzin", ale "dzisiaj" - czyli zasadniczo z "dzienną" precyzją.Moment.js - jutro, dziś i wczoraj

Próbowałem przy użyciu funkcji moment().calendar(), nie formatować jeśli różnica data jest więcej niż 1 dzień

Odpowiedz

7

W Moment.js metoda from() ma codzienny precyzję 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" 
+1

dziękuję, ale nadal nie wyświetla "dzisiaj" i wyświetla np. "1 dzień temu" zamiast "wczoraj" - wygląda na to, że potrzebna mi funkcja musi być niestandardowa. – Ziarno

+0

'Z' nie ma tak naprawdę codziennej precyzji. Na przykład, jeśli wczoraj było cztery godziny temu, a wybieram czas, który był pięć godzin temu, powie "5 godzin temu" zamiast wczoraj. To rozwiązanie nie ma nic wspólnego z precyzją "z", ale z terminów przekazywanych. –

19

Można dostosować sposób wyświetlania dat dla metod .fromNow i .calendar przy użyciu moment.updateLocale. Poniższy kod zmieni sposób, że .calendar wyświetla jak na pytanie:

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

Bazując na pytanie, wydaje się metodą .calendar byłaby bardziej odpowiednia - .fromNow chce mieć przeszłość/teraźniejszość prefiksu/sufiksu , ale jeśli chcesz dowiedzieć się więcej, możesz przeczytać dokumentację pod numerem http://momentjs.com/docs/#/customization/relative-time/.

Aby to wykorzystać tylko w jednym miejscu zamiast nadpisywania lokalizacje, przekaż ciąg wyboru jako pierwszy argument podczas definiowania moment.updateLocale a następnie wywołać metodę kalendarza przy użyciu tego ustawienia regionalne (np. moment.updateLocale('yesterday-today').calendar(/* moment() or whatever */))

EDYCJA: Moment^2.12.0 ma teraz metodę updateLocale. updateLocale i locale wydają się być funkcjonalnie takie same, a locale nie jest jeszcze przestarzałe, ale zaktualizował odpowiedź, aby użyć nowszej metody.

+0

to zmienia globalną lokalizację, potrzebuję tego w jednym miejscu :) – Ziarno

+0

Zobacz edycję - możesz utworzyć niestandardowe ustawienia lokalne zamiast nadpisywać istniejące lokalizacje – svangordon

5

Więc to, co skończyło się robi

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

Mam ten sam problem, ale muszę zastosować i18n i mam 10 języków ... więc liczyłem na moment internacjonalizacji JS ... – Chexpir

25

Można też to zrobić, aby uzyskać datę na dziś i jutro i wczoraj

let today  = moment(new Date()); 

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

let yesterday = moment(new Date()).add(-1, 'days'); 
+0

tego nie ma w oficjalnym api! proszę podać polyfill do tego –

+0

zobacz dokumenty tutaj https://momentjs.com/docs/#/manipulating/add/ Jedyne co dodaję to 'new Date()', aby uniknąć ostrzeżenia, że ​​lib ciągle daje ja (patrz https://momentjs.com/docs/#/parsing/now/) – HussienK

+0

przepraszam za głosowanie w dół, ale nie o to prosiłem. Jestem zaskoczony, że jest to najwyższa głosowana odpowiedź (w chwili pisania tego tekstu) ... – Ziarno

5

mam podobne rozwiązanie, ale pozwala na użycie locales:

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' 
11

używam kombinacji add() i endOf() z Môme nt

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

Od 2.10.5 chwili obsługuje określania formatów wyjściowych kalendarz za wezwaniem Dla bardziej szczegółowego sprawdzenia dokumentacji Moment - Calendar.

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

Z kalendarza 2.14.0 można również uzyskać wywołanie zwrotne w celu zwrócenia wartości.

Powiązane problemy