Для работы с Moment.js в Vue-проектах необходимо сначала установить библиотеку через npm или yarn:
npm install moment
# или
yarn add moment
После установки подключение может быть выполнено локально в компоненте или глобально через плагин Vue. Локальное подключение выполняется следующим образом:
import moment from 'moment';
export default {
data() {
return {
currentDate: moment().format('YYYY-MM-DD')
}
}
}
Для глобального подключения, чтобы использовать Moment.js во всех компонентах, создаётся плагин:
import { createApp } from 'vue';
import App from './App.vue';
import moment from 'moment';
const app = createApp(App);
app.config.globalProperties.$moment = moment;
app.mount('#app');
Теперь доступ к Moment.js возможен через this.$moment в
любом компоненте.
Moment.js предоставляет богатый функционал для форматирования дат. В Vue его можно использовать как в вычисляемых свойствах, так и напрямую в шаблонах.
Примеры форматирования:
computed: {
formattedDate() {
return this.$moment(this.currentDate).format('DD.MM.YYYY');
},
fullDateTime() {
return this.$moment(this.currentDate).format('dddd, MMMM Do YYYY, h:mm:ss a');
}
}
В шаблоне:
<p>Текущая дата: {{ formattedDate }}</p>
<p>Полная дата и время: {{ fullDateTime }}</p>
Основные форматные токены:
YYYY – год в 4 цифрыMM – месяц с ведущим нулёмDD – день месяца с ведущим нулёмHH – часы в 24-часовом форматеhh – часы в 12-часовом форматеmm – минутыss – секундыa – am/pmMoment.js поддерживает множество языков, что особенно полезно для приложений на Vue с многоязычным интерфейсом.
Подключение локализации:
import 'moment/locale/ru';
moment.locale('ru');
После этого все форматированные даты автоматически будут использовать русские названия месяцев и дней недели.
computed: {
localizedDate() {
return this.$moment().format('LLLL'); // "пятница, 22 мая 2026 г., 14:30"
}
}
Для вычислений используется метод diff:
computed: {
daysUntilEvent() {
const eventDate = this.$moment('2026-06-15');
return eventDate.diff(this.$moment(), 'days');
},
hoursUntilEvent() {
const eventDate = this.$moment('2026-06-15 18:00');
return eventDate.diff(this.$moment(), 'hours');
}
}
Метод diff принимает два параметра: единицу измерения
(days, hours, minutes и др.) и
булевый флаг для точного расчёта с дробными числами.
Moment.js позволяет легко добавлять или вычитать время:
computed: {
nextWeek() {
return this.$moment().add(7, 'days').format('DD.MM.YYYY');
},
lastMonth() {
return this.$moment().subtract(1, 'months').format('DD.MM.YYYY');
}
}
Поддерживаемые единицы: years, months,
weeks, days, hours,
minutes, seconds.
Для удобства часто создаются фильтры (Vue 2) или методы вычисляемых свойств (Vue 3). Пример метода для шаблона:
methods: {
formatDate(date, format = 'DD.MM.YYYY') {
return this.$moment(date).format(format);
}
}
В шаблоне:
<p>Дата события: {{ formatDate(event.date, 'dddd, MMMM Do YYYY') }}</p>
Такой подход позволяет стандартизировать форматирование во всём приложении.
При использовании Moment.js с реактивными данными Vue важно помнить, что объекты Moment не являются реактивными по умолчанию. Для корректного обновления интерфейса лучше хранить даты в виде строк или ISO-формата, а преобразование в Moment выполнять при рендеринге:
data() {
return {
rawDate: '2026-05-22T14:30:00'
}
},
computed: {
displayDate() {
return this.$moment(this.rawDate).format('DD.MM.YYYY HH:mm');
}
}
Календарь событий:
computed: {
upcomingEvents() {
return this.events
.filter(event => this.$moment(event.date).isAfter(this.$moment()))
.sort((a, b) => this.$moment(a.date).diff(this.$moment(b.date)));
}
}
Отображение времени относительно текущего момента:
computed: {
eventRelativeTime() {
return this.$moment(this.rawDate).fromNow(); // "через 3 дня", "5 минут назад"
}
}
$moment, чтобы избежать повторного импорта в каждом
компоненте.moment.min.js или альтернативы, такие как
dayjs, если нужны только базовые функции.Moment.js в связке с Vue обеспечивает гибкую и мощную работу с датами
и временем, позволяя создавать локализованные, реактивные и удобные
интерфейсы без сложных манипуляций с нативным объектом
Date.