Momentjs countdown - Duration показывает отрицательные числа - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь создать обратный отсчет с MomentJS (2.22.2) и Rxjs (6.2.2) interval. Но когда я достигаю некоторых моментов времени, мой обратный отсчет сходит с ума и выдает отрицательные числа, где он должен был бы, например, вычесть день и начать в 23 часа.

Любая помощь о том, как я должен это исправить?


Пример

местное время: 2018-09-05T18:49

Время окончания: 2018-11-03T18:00

это приводит к:

Negative countdown


Мой код

'this.days', 'this.hours', 'this.minutes' & 'this.seconds' - это локальные переменные, которые содержат строковое представление результирующего времени (строковый формат, потому что я хочу показать начальные нули)

interval(1000).subscribe(() => {
      const now = moment();
      let timeLeft = this.endDate.diff(now, 'milliseconds', true);
      let endDate = moment(this.endDate); // Use 'moment' to make a new copy

      // Days
      const days = Math.floor(moment.duration(timeLeft).asDays());
      console.warn(moment.duration(timeLeft).asDays());
      this.days = Countdown.addLeadingZeros(days.toString(), 3);

      endDate = endDate.subtract(days, 'days');
      timeLeft = endDate.diff(now, 'milliseconds', true);

      // Hours
      const hours = Math.floor(moment.duration(timeLeft).asHours());
      console.warn(Math.round(moment.duration(timeLeft).asHours()));
      this.hours = Countdown.addLeadingZeros(hours.toString(), 2);

      endDate = endDate.subtract(hours, 'hours');
      timeLeft = endDate.diff(now, 'milliseconds', true);

      // Minutes
      const minutes = Math.floor(moment.duration(timeLeft).asMinutes());
      this.minutes = Countdown.addLeadingZeros(minutes.toString(), 2);

      endDate = endDate.subtract(minutes, 'minutes');
      timeLeft = endDate.diff(now, 'milliseconds', true);

      // Seconds
      const seconds = Math.floor(moment.duration(timeLeft).asSeconds());
      this.seconds = Countdown.addLeadingZeros(seconds.toString(), 2);
});

Кто-нибудь видит, что я здесь делаю неправильно или как я могу улучшить этот код?

1 Ответ

0 голосов
/ 05 сентября 2018

Отрицательные числа возникают в вашем коде из-за изменения летнего времени.

Здесь, в Великобритании, существует переход на летнее время между 2018-09-05 и 2018-11-03. На самом деле это на 2018-10-28. Я могу воспроизвести вашу проблему, если я выберу две даты по обе стороны от этого, но нет, если обе даты находятся на одной стороне. Я предполагаю, что там, где вы живете, существует также изменение летнего времени между 2018-09-05 и 2018-11-03.

Самый простой способ избежать подобных проблем - это рассчитать разницу во времени по UTC. Вместо написания

  const now = moment();

запись

  const now = moment().utc();

и убедитесь, что this.endDate создано в UTC, а не по местному времени.

...