Отображение времени относительно заданного с использованием библиотеки Luxon - PullRequest
0 голосов
/ 11 декабря 2018

Поддерживает ли luxon функцию отображения времени относительно заданного?

Момент имеет функцию "Календарное время":

https://momentjs.com/docs/#/displaying/calendar-time/

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

Могу ли я достичьТо же самое с использованием Luxon?

1 Ответ

0 голосов
/ 11 декабря 2018

Из версии 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 в Luxon не было calendar() эквивалента.

Для пользователей Moment страница справочника, указанная в эквивалентности метода DateTime => Output => Humanization section:

Luxon не поддерживает их и выиграл 't до тех пор, пока в браузерах не появится предложение Относительный формат времени .

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>

Этот код примерно вдохновлен с момента код , его можно определенно улучшить.

...