Момент JS определяет, сколько дней, недель прошло

Я не очень хорошо справляюсь со временем. Я использовал моменты для ионного приложения, чтобы манипулировать временем, но я хочу достичь того, чего не смог.

Я использовал трубку для этого и хочу отобразить, основываясь на том, сколько дней прошло, или на неделях, месяцах или годах. Использование относительного времени помогло бы мне fromNow() метод и calendar() моментов. Но в моем случае у меня было бы несколько conditions,

Вот пример кода ниже моей трубы

transform(value: Date | moment.Moment, dateFormat: string): any {
    if (moment(value) < moment(value).subtract(7, 'days')) {
      return moment(value).format('llll') // Use this format if weeks, months or years has passed
    } else if (moment(value) < moment(value).subtract(1, 'days')) {
      return moment(value).calendar(); // Use calendar time if 1 day has passed
    } else {
      return moment(value).fromNow(); // Use relative time if within 24 hours
    }
  }

Если секунд, минут или часов прошло до 24 часов, я буду использовать fromNow() метод, но когда пройдут дни, я буду использовать calendar() и если недели, месяцы или годы прошли, используйте это format('llll'),

Может кто-нибудь пролить свет на меня?

Заранее спасибо.

2 ответа

Решение

Из того, что я понимаю, вы хотите принять решение, основанное на том, как давно now, Кажется, у вас есть 3 случая: > 7 дней, > 1 день, <1 день.

Momentjs предоставляет очень полезный diff метод. Итак, вы можете сделать что-то вроде:

  var currDate = moment.now();
  var dateToTest = moment(val);
  // if dateToTest will always be in past, use currDate as the base to diff, else 
  be prepared to handle the negative outcomes. 
  var result = currDate.diff(dateToTest, 'days')

window.onload = function() {
  console.log("Test Cases: ")
  console.log("Input: Date is 2 minutes behind")
  dateThing("2018-07-20T12:02:54+00:00");
  
  console.log("Input: Date is few hours behind")
  dateThing("2018-07-20T07:02:54+00:00");
  
  console.log("Input: Date is 23 hours 59 minutes behind")
  dateThing("2018-07-19T12:03:54+00:00");
  
  console.log("Input: Date is 24 hours behind")
  dateThing("2018-07-19T12:04:54+00:00");
  
  console.log("Input: Date is 2 days behind")
  dateThing("2018-07-18T12:04:54+00:00");
  
  console.log("Input: Date is 12 days behind")
  dateThing("2018-07-08T12:04:54+00:00");
}

dateThing = function(val) {
  // for now freezing the "now" so that precise testcases can be written.
  // var currDate = moment.now();
  var currDate = moment("2018-07-20T12:04:54+00:00")
  var dateToTest = moment(val);
  // if dateToTest will always be in past, use currDate as the base to diff, else be prepared to handle the negative outcomes. 
  var result = currDate.diff(dateToTest, 'days')
  if (result > 7) {
    console.log("Output: date is more than 1 week behind")
  } else if (result > 1) {
    console.log("Output: date is more than 1 day but less than 1 week behind")
  } else {
    console.log("Output: date is less  than 1 day behind")
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Пожалуйста, запустите приведенный выше фрагмент кода, чтобы увидеть поведение для граничных случаев. Если оно не точное, вы можете перейти к diff с минутами и обратить вспять процесс.

Вот и ты.:)

function transformDate(givenDate) {
    if (moment().subtract(7, 'days').valueOf() > moment(givenDate).valueOf()) {
      return moment(givenDate).format('llll');
    } else if (moment().subtract(1, 'days').valueOf() > moment(givenDate).valueOf()) {
      return moment(givenDate).calendar();
    } else {
      return moment(givenDate).fromNow();
    }
}
// current time
console.log(transformDate(new Date()));
// 8 days before this answer was posted 
console.log(transformDate(new Date(1531394211385))); 
// 2 days before this answer was posted
console.log(transformDate(new Date(1531912692803))); 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js"></script>

Другие вопросы по тегам