Moment: Функция "week ()" возвращает неверный номер недели.

Созданный на 19 июл. 2018  ·  5Комментарии  ·  Источник: moment/moment

Описание проблемы и шаги по воспроизведению:
При создании даты, например [2018, 11, 29] , и выполнении функции week результат будет 52 , но для [2018, 11, 30] и для 31 также он возвращает 1 . Ожидаемый результат: 52 .

Пример

const a = moment([2018, 11, 29]);
console.log('a', a.year(), a.week());
//a 2018 52

const b = moment([2018, 11, 30]);
console.log('b', b.year(), b.week());
//b 2018 1

живой пример jsbin

Среда:
Safari 11.1.2 on OSX

Другая информация, которая может быть полезна:

"Thu Jul 19 2018 16:52:11 GMT+0200 (CEST)"
"7/19/2018, 4:52:11 PM"
-120
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
"2.14.1"

Самый полезный комментарий

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

например, вы думаете, что 1 января всегда приходится на неделю 1, а 31 декабря всегда на неделе 52/53 - и, честно говоря, некоторые настенные календари показывают такую ​​нумерацию недель.

Когда дело доходит до стандартизации номеров недель, предпочтительно, чтобы неделя всегда состояла из 7 дней. Для стандарта ISO: недели проходят с понедельника по воскресенье, а неделя 1 включает первый четверг года. Это означает, что с понедельника по среду первой недели _ может выпадать_ в предыдущем году. (это произойдет в 2019/2020 гг .: 29-31 декабря 2019 г. считаются частью 1-й недели 2020 г.)

Вы не используете методы ISO ( isoWeek() / isoWeekYear() ), поэтому вы полагаетесь на определение недели, установленное в вашем регионе, которое длится с воскресенья по субботу.

30 декабря 2018 года - воскресенье и первый день недели в вашем регионе. Только 2 дня этой недели приходятся на 2018 год, остальная часть приходится на 2019 год. Правила для вашего региона используются, чтобы решить, будет ли эта неделя (все 7 дней) классифицироваться как 53-я неделя 2018 или 1-я неделя 2019-го. , они сказали 2019 неделя 1.

Все 5 Комментарий

Мы сталкиваемся с той же проблемой.
console.log(moment("2018-w15", "YYYY-[w]WW").add(38, "weeks").format("YYYY-[w]WW"))
показывает 2018-w01

@ numen31337 Вы, вероятно, захотите использовать weekYear () вместо year()

@Blapi WW - это неделя ISO, поэтому вам, скорее всего, потребуется использовать GGGG вместо YYYY при форматировании ( GGGG - это "год недели" ISO )

Я немного поясню это, вот код с датами и соответствующим выводом:

const a = moment([2018, 11, 29]);
console.log(
            `a year: ${a.year()}`,  //a year: 2018
            `a month: ${a.month()}`, //a month: 11
            `a date: ${a.date()}`, //a date: 29
            `a week: ${a.week()}`, //a week: 52
            `a weekYear: ${a.weekYear()}`, //a weekYear: 2018
);

const b = moment([2018, 11, 30]);
console.log(
            `b year: ${b.year()}`, //b year: 2018
            `b month: ${b.month()}`, //b month: 11
            `b date: ${b.date()}`, //b date: 30
            `b week: ${b.week()}`, //b week: 1 <=== Why 1?
            `b weekYear: ${b.weekYear()}`, //b weekYear: 2019 <=== Why 2019?
);

Проблема для меня в том, что week for 2018, 11, 30 возвращает 1 вместо 52 . Может я неправильно понял какие-то концепции этой библиотеки? В конечном итоге моей задачей было вычислить количество календарных недель между двумя датами, и я сделал это с помощью следующего обходного пути:

const fromDateStartWeek = fromDate.startOf('week');
const toDateStartWeek = toDate.startOf('week');
return toDateStartWeek.diff(fromDateStartWeek, 'weeks');

Но я все еще бродил об этой функции week . Это ошибка или я что-то упускаю? Я пришел из собственной разработки и довольно новичок в javascript. Спасибо.

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

например, вы думаете, что 1 января всегда приходится на неделю 1, а 31 декабря всегда на неделе 52/53 - и, честно говоря, некоторые настенные календари показывают такую ​​нумерацию недель.

Когда дело доходит до стандартизации номеров недель, предпочтительно, чтобы неделя всегда состояла из 7 дней. Для стандарта ISO: недели проходят с понедельника по воскресенье, а неделя 1 включает первый четверг года. Это означает, что с понедельника по среду первой недели _ может выпадать_ в предыдущем году. (это произойдет в 2019/2020 гг .: 29-31 декабря 2019 г. считаются частью 1-й недели 2020 г.)

Вы не используете методы ISO ( isoWeek() / isoWeekYear() ), поэтому вы полагаетесь на определение недели, установленное в вашем регионе, которое длится с воскресенья по субботу.

30 декабря 2018 года - воскресенье и первый день недели в вашем регионе. Только 2 дня этой недели приходятся на 2018 год, остальная часть приходится на 2019 год. Правила для вашего региона используются, чтобы решить, будет ли эта неделя (все 7 дней) классифицироваться как 53-я неделя 2018 или 1-я неделя 2019-го. , они сказали 2019 неделя 1.

Спасибо тебе за пояснение. Для меня это действительно удивительно. Мне очень не хватает API, например, из календаря Apple dateComponents (_: from: to :), где вы можете запросить разницу в определенных компонентах, в моем случае Calendar.current.dateComponents([.weekOfYear], from: sinceDay, to: targetDay) и получить разницу в реальных неделях года, не только days / 7 .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги