Отображение времени относительно заданного с использованием библиотеки Luxon
Поддерживает ли Luxon функцию отображения времени относительно заданного?
Момент имеет функцию "Календарное время":
moment().calendar(null, {
sameDay: '[Today]',
nextDay: '[Tomorrow]',
nextWeek: 'dddd',
lastDay: '[Yesterday]',
lastWeek: '[Last] dddd',
sameElse: 'DD/MM/YYYY'
});
Могу ли я добиться того же, используя Luxon?
1 ответ
От версии 1.9.0
ты можешь использовать toRelativeCalendar
:
Возвращает строковое представление этой даты относительно сегодняшнего дня, например, поддерживаемые платформой "вчера" или "следующий месяц"
Intl.RelativeDateFormat
,
const DateTime = luxon.DateTime;
const now = DateTime.local();
// Some test values
[ now,
now.plus({days: 1}),
now.plus({days: 4}),
now.minus({days: 1}),
now.minus({days: 4}),
now.minus({days: 20}),
].forEach((k) => {
console.log( k.toRelativeCalendar() );
});
<script src="https://cdn.jsdelivr.net/npm/luxon@1.10.0/build/global/luxon.js"></script>
До версии 1.9.0
не было calendar()
эквивалент в люксоне.
Страница руководства пользователя For Moment указана в разделе Эквивалентность метода DateTime => Output => Humanization:
Luxon не поддерживает их, и не будет, пока предложение о формате относительного времени не появится в браузерах.
Operation | Moment | Luxon --------------------------------------------------------------------------------------- "Calendar time" | calendar() | None (before 1.9.0) / toRelativeCalendar() (after 1.9.0)
Если вам нужно, вы можете написать что-нибудь сами, вот пример пользовательской функции, которая имеет аналогичный результат calendar()
:
const DateTime = luxon.DateTime;
function getCalendarFormat(myDateTime, now) {
var diff = myDateTime.diff(now.startOf("day"), 'days').as('days');
return diff < -6 ? 'sameElse' :
diff < -1 ? 'lastWeek' :
diff < 0 ? 'lastDay' :
diff < 1 ? 'sameDay' :
diff < 2 ? 'nextDay' :
diff < 7 ? 'nextWeek' : 'sameElse';
}
function myCalendar(dt1, dt2, obj){
const format = getCalendarFormat(dt1, dt2) || 'sameElse';
return dt1.toFormat(obj[format]);
}
const now = DateTime.local();
const fmtObj = {
sameDay: "'Today'",
nextDay: "'Tomorrow'",
nextWeek: 'EEEE',
lastDay: "'Yesterday'",
lastWeek: "'Last' EEEE",
sameElse: 'dd/MM/yyyy'
};
// Some test values
[ now,
now.plus({days: 1}),
now.plus({days: 4}),
now.minus({days: 1}),
now.minus({days: 4}),
now.minus({days: 20}),
].forEach((k) => {
console.log( myCalendar(now, k, fmtObj) );
});
<script src="https://cdn.jsdelivr.net/npm/luxon@1.8.2/build/global/luxon.js"></script>
Этот код примерно вдохновлен моментным кодом, его можно определенно улучшить.