2016-02-16 4 views
21

Я бы хотел использовать функциональность moment().fromNow(), но когда дата близка, она слишком точна - пример. Я не хочу, чтобы он показывал «через 3 часа», но «сегодня» - так в основном с «ежедневной» точностью.Moment.js - завтра, сегодня и вчера

Я попытался с помощью функции moment().calendar(), это не формат, если разница дата является более чем 1 день

ответ

7

В 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" 
+1

спасибо, но он по-прежнему не отображает «сегодня» и отображает ex. «1 день назад» вместо «вчера» - похоже, что функциональность, в которой я нуждаюсь, должна быть настраиваемой. – Ziarno

+0

'from' на самом деле не имеет ежедневной точности. Например, если вчера было четыре часа назад, и я выбираю время, которое было пять часов назад, он будет говорить «5 часов назад» вместо вчерашнего. Это решение не имеет ничего общего с точностью 'from', но от дат, прошедших в. –

19

Вы можете настроить способ отображения чисел .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 */))

EDIT: Момент^2.12.0 теперь имеет метод updateLocale. updateLocale и locale выглядят функционально одинаковыми, а locale еще не устарел, но обновил ответ, чтобы использовать новый метод.

+0

это меняет глобальную локализацию, мне просто нужно это в 1 месте :) – Ziarno

+0

См. Edit - вы можете создавать собственные локали вместо перезаписывания существующих локалей – svangordon

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

У меня такая же проблема, но мне нужно применить i18n, и у меня есть 10 языков ... так что я полагался на момент JS интернационализации ... – Chexpir

25

Вы также можете сделать это, чтобы получить дату сегодня и завтра и вчера

let today  = moment(new Date()); 

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

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

это не в официальном api! пожалуйста, укажите полиполк, который у вас есть для этого –

+0

см. в документах. https://momentjs.com/docs/#/manipulating/add/ Единственное, что я добавляю, это 'new Date()', чтобы избежать предупреждения, которое lib продолжает давать me (см. https://momentjs.com/docs/#/parsing/now/) – HussienK

+0

извините за понижение голосов, но это не то, о чем я просил. Я удивлен, что это главный голосовой ответ (на момент написания) ... – Ziarno

5

У меня есть подобное решение, но и позволяет использовать локалей:

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

Я использую комбинацию add() и endOf() с Môme нт

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

С 2.10.5 момент поддерживает задание календаря форматов вывод за вызов Для более детальной проверки документации Moment - Calendar.

**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 calendar также может быть обратный вызов для возврата значений.

**Moment 2.14.0** 
    moment().calendar(null, { 
    sameDay: function (now) { 
     if (this.isBefore(now)) { 
     return '[Will Happen Today]'; 
     } else { 
     return '[Happened Today]'; 
     } 
     /* ... */ 
     } 
    }); 
Смежные вопросы