Ошибка MomentJS с понедельником по номеру недели

#javascript #momentjs

#javascript #momentjs

Вопрос:

У меня есть функция, которая захватывает ключ даты в формате ГГГГ-ММ-ДД, например. 2021-03-29 (понедельник) получает номер недели (13) и, используя это, получает понедельник с номером недели, в случае 2021-03-29 это будет тот же день, в случае 2021-03-30 это должно быть 2021-03-29 и т.д., При условии, что это на той же неделе (по номеру недели)

Я создал для этого изолированную среду.

http://jsfiddle.net/x6sL8k7e/1/

Тестовый код

 const dateKey = "2021-03-29"
const weekNumber = moment(dateKey, 'YYYY-MM-DD').isoWeek() // getting week nr - 13
    
      
const date = moment(dateKey, 'YYYY-MM-DD')
        .clone()
        .week(weekNumber) // want to get monday for week #13
        .day('Monday')
        
console.log('date', date.format('YYYY-MM-DD'))
  

PS. Он безупречно работает с датами этого года (любой датой)

Комментарии:

1. Похоже, проблема возникает ближе к началу нового года. Попробуйте следующие даты и увидите, что результаты выходят из строя: 2021-01-01, 2021-01-04, 2021-01-11 Вывод: "date", "2021-12-27", "date", "2020-12-28", "date", "2021-01-04" Несмотря на ожидаемые отклонения ISO от григорианского календаря, первый и второй выходные данные парадоксальны. Однако это следует перенести на момент , а не здесь.

Ответ №1:

Чао, я решил твою проблему, заменив isoWeek на week вот так:

 const dateKey = "2021-03-29"
const weekNumber = moment(dateKey, 'YYYY-MM-DD').week()
    console.log(weekNumber)
      
      const date = moment(dateKey, 'YYYY-MM-DD')
        .clone()
        .week(weekNumber)
        .day('Monday')
        
        console.log('date', date.format('YYYY-MM-DD'))
  

Здесь ваш код изменен.

В любом случае, я понимаю вашу проблему и это может быть связано с тем фактом, что в 2020 году 53 недели, а в 2021 году 52 недели.

введите описание изображения здесь

Таким образом, isoWeek корректно повторяется 13-я неделя, но week повторяется 14-я (возможно), потому что считается, что каждый год состоит из 52 недель.

Комментарии:

1. Как было предложено в комментарии, этот вопрос следует обсудить с разработчиками moment JS

2. Я согласен, мой ответ был всего лишь предложением о том, где может быть проблема с OP.

3. Поднимать проблему перед разработчиками MomentJS долго и займет много времени. Я должен исправить это в рабочей среде, и у меня нет времени на это, чтобы исправить это вручную : (

4. @Alex и использовать week вместо isoWeek не может быть хорошим решением?

5. Сложно, потому что весь мой вспомогательный файл вращается вокруг стандартной недели (ISOWeek начинается в воскресенье, а мне нужно начать с понедельника) и, вероятно, требует, чтобы я все перезаписал

Ответ №2:

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

   const dayOfTheWeekNumber = toNumber(
    moment(dateKey, 'YYYY-MM-DD')
      .clone()
      .format('e')
  )
  const date = moment(dateKey).subtract(
    dayOfTheWeekNumber === 0 ? 6 : dayOfTheWeekNumber - 1,
    'days'
  )