Описание проблемы и шаги по воспроизведению:
При создании даты, например [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
Среда:
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"
Мы сталкиваемся с той же проблемой.
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
.
Самый полезный комментарий
Я думаю, вы, вероятно, ожидаете, как работает нумерация недель, и это отличается от устоявшейся практики.
например, вы думаете, что 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.