Путать зацикливание даты в момент JS - PullRequest
0 голосов
/ 10 октября 2018

Я пишу небольшой фрагмент JavaScript, который поможет мне получить значения между двумя датами (включая сегодняшний день).

Вот мой код.

var beforeSevenDays = moment(Date.now() - 7 * 24 * 3600 * 1000).format('YYYY-MM-DD');
var i = 0;
for (var m = moment(beforeSevenDays); m.diff(moment(Date.now()).local('in'), 'days') <= 0; m.add(1, 'days')) {
    console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
    i += 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

когда я запускаю этот код, я получаю вывод

i: 0 2018-10-03
i: 1 2018-10-04
i: 2 2018-10-05
i: 3 2018-10-06
i: 4 2018-10-07
i: 5 2018-10-08
i: 6 2018-10-09
i: 7 2018-10-10
i: 8 2018-10-11

, но ожидаемый вывод

i: 0 2018-10-03
i: 1 2018-10-04
i: 2 2018-10-05
i: 3 2018-10-06
i: 4 2018-10-07
i: 5 2018-10-08
i: 6 2018-10-09
i: 7 2018-10-10

здесь, когда я изменяю запрос как m.diff(moment(Date.now()).local('in'), 'days') < 0 Я получаю вывод как

i: 0 2018-10-03
i: 1 2018-10-04
i: 2 2018-10-05
i: 3 2018-10-06
i: 4 2018-10-07
i: 5 2018-10-08
i: 6 2018-10-09

, пожалуйста, дайте мне знать, где я ошибаюсь и как я могу это исправить.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

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

Как видно из фрагмента ниже, разность дней равна 0, а разность часов - не 0. Итак, вам нужно заморозить время до чего-то, например startOf('day')

var beforeSevenDays = moment(Date.now() - 7 * 24 * 3600 * 1000).format('YYYY-MM-DD');
var i = 0;
for (var m = moment(beforeSevenDays); m.diff(moment(Date.now()).local('in'), 'days') <= 0; m.add(1, 'days')) {
  console.log("diff in hours is: " + m.diff(moment(Date.now()).local('in'), 'hours'))
  console.log("diff in days is: " + m.diff(moment(Date.now()).local('in'), 'days'))
  console.log("diff in days with startOf is: " + m.diff(moment(Date.now()).startOf('day').local('in'), 'days'))
  console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
  i += 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
0 голосов
/ 10 октября 2018

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

var moment =require('moment');

var beforeSevenDays = moment().subtract(7, 'days').format('YYYY-MM-DD');
var i = 0;

for (var m = moment(beforeSevenDays); m.diff(moment(Date.now()), 'days') <0 || m.isSame(moment(), 'day'); m.add(1, 'days')) {
    console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
    i += 1;
}

Вы можете добавить еще одно условие, которое можно проверить на тот же день.

0 голосов
/ 10 октября 2018

Проблема с вашим кодом состоит в том, что вы сравниваете полные даты, moment(Date.now()) создает момент времени, который включает дату и время, поэтому ваш вывод зависит от времени, когда вы его выполняете.

Я предлагаюиспользовать startOf('day'), что:

Изменяет исходный момент, устанавливая его в начало единицы времени.

Здесь живойобразец:

var beforeSevenDays = moment().subtract(7, 'days').format('YYYY-MM-DD');
var today = moment().startOf('day');
var i = 0;
for (var m = moment(beforeSevenDays); m.diff(today, 'days') <= 0; m.add(1, 'days')) {
    console.log("i: " + i + " " + m.format('YYYY-MM-DD'));
    i += 1;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

Примечание: вы можете просто использовать moment(), чтобы получить текущую дату и время, не нужно использовать Date.now(), moreoveryouможно использовать subtract(), чтобы получить 7 дней назад без выполнения математических операций, наконец, нет необходимости использовать local() (не используйте его вместе с locale()) с момента создания по умолчанию в локальном режиме.

...