Как использовать Moment.js?
Я не могу выполнить документацию Moment.js и вам нужна помощь в ее настройке. Я правильно ссылался на файл moment.min.js
на моей веб-странице следующим образом:
<script src="/js/moment.min.js"></script>
Приходя в HTML-часть моей веб-страницы, у меня есть две разные даты на той же странице:
Дата публикации
<time class="pubdate" datetime="2012-06-09T12:32:10-04:00" pubdate>
June 09, 2012
</time>
Дата последней модификации
<time class="updated" itemprop="dateModified" datetime="2012-06-09T12:32:10-04:00">
June 9, 2012 ~ 12:32
</time>
Важно! Относительный синтаксический анализ даты не должен превышать "вчера". Что касается всего выше, теги <time>
должны отображать точное время и дату, которое они могли бы использовать без JavaScript - то есть Moment.js не должен касаться или анализировать даты, прошедшие "вчера".
Теперь, чтобы библиотека выполняла свою работу, как указано выше, мне нужно вызвать функцию после ссылки на библиотеку. Итак, вопрос в том, какова должна быть функция? (Использование jQuery в порядке, поскольку я уже ссылаюсь на библиотеку на моей веб-странице.)
Ответы
Ответ 1
Пожалуйста, укажите свой вопрос. Я предполагаю, что вы хотите относительный синтаксический анализ даты, а максимум должен быть "вчера".
Я никогда не использовал moment.js, но, насколько говорят документы, это довольно просто.
Используйте var now = moment();
в качестве текущей даты. Затем проанализируйте каждый time
-Tag в DOM с помощью var time = moment($(e).attr('datetime'));
Чтобы проверить разницу, используйте метод diff()
:
if(now.diff(time, 'days') <= 1) {
// getting the relative output
}
Используйте var ago = now.from(time)
для получения относительного вывода и замените время в DOM своей переменной ago
.
Обновление на основе комментария:
Хорошо, хорошо непроверено, но что основная идея:
Обновлен код.
var now = moment();
$('time').each(function(i, e) {
var time = moment($(e).attr('datetime'));
if(now.diff(time, 'days') <= 1) {
$(e).html('<span>' + time.from(now) + '</span>');
}
});
Ответ 2
Вы также можете использовать функцию moment().calendar()
, которая будет форматировать даты, близкие к сегодняшним дням (до недели с сегодняшнего дня):
$('time').each(function(i, e) {
var time = moment($(e).attr('datetime'));
$(e).html('<span>' + time.calendar() + '</span>');
});
Вы можете настроить строки формата с помощью этого кода:
moment.calendar = {
lastDay : '[Yesterday at] LT',
sameDay : '[Today at] LT',
nextDay : '[Tomorrow at] LT',
lastWeek : '[last] dddd [at] LT',
nextWeek : 'dddd [at] LT',
sameElse : 'L'
};
Если вас не интересуют даты форматирования до вчерашнего дня, просто измените форматы lastWeek
и nextWeek
на полный формат даты (например, 'L'
).
UPDATE 2013-09-06. По-видимому, у него есть новый синтаксис, который также позволяет локализовать его:
moment.lang('en', {
calendar: {
lastDay : '[Yesterday at] LT',
sameDay : '[Today at] LT',
nextDay : '[Tomorrow at] LT',
lastWeek : '[last] dddd [at] LT',
nextWeek : 'dddd [at] LT',
sameElse : 'L'
}
});
Ответ 3
Благодаря @JohannesKlauß для кода. Это в основном то, как я выполнил его ответ и как я ссылаюсь на код на своем веб-сайте.
<script src="/js/moment.min.js"></script>
<script src="/js/moment.executor.js"></script>
Где moment.min.js - библиотека Moment.js, а moment.executor.js имеет этот код (любезно предоставлен Йоханнесом):
jQuery(document).ready(function($){
var now = moment();
$('time').each(function(i, e) {
var time = moment($(e).attr('datetime'));
if(now.diff(time, 'days') <= 1) {
$(e).html('<span>' + time.from(now) + '</span>');
}
});
});
PS: Фактически вы можете отредактировать moment.min.js и добавить в него вышеупомянутый код в конце. Таким образом, вы сохраните один дополнительный HTTP-запрос.: P
Ответ 4
Расширение реализации @its_me выше, здесь версия, которая
- обновляет все элементы с заданным классом
- хранит их каждую минуту (так что "1 минута назад" становится "2 минуты назад" )
- переключается в другой формат в течение + -1 дня (например, в прошлый вторник в 23:45).
Здесь JSFiddle для вас.
Ваш HTML:
<time class="cw-relative-date" datetime="2014-06-09T12:32:10-00:00"></time>
JS включает:
(function () {
// Define a function that updates all relative dates defined by <time class='cw-relative-date'>
var updateAllRelativeDates = function() {
$('time').each(function (i, e) {
if ($(e).attr("class") == 'cw-relative-date') {
// Initialise momentjs
var now = moment();
moment.lang('en', {
calendar : {
lastDay : '[Yesterday at] LT',
sameDay : '[Today at] LT',
nextDay : '[Tomorrow at] LT',
lastWeek : '[Last] dddd [at] LT',
nextWeek : 'dddd [at] LT',
sameElse : 'D MMM YYYY [at] LT'
}
});
// Grab the datetime for the element and compare to now
var time = moment($(e).attr('datetime'));
var diff = now.diff(time, 'days');
// If less than one day ago/away use relative, else use calendar display
if (diff <= 1 && diff >= -1) {
$(e).html('<span>' + time.from(now) + '</span>');
} else {
$(e).html('<span>' + time.calendar() + '</span>');
}
}
});
};
// Update all dates initially
updateAllRelativeDates();
// Register the timer to call it again every minute
setInterval(updateAllRelativeDates, 60000);
})();