![enter image description here](https://i.stack.imgur.com/DlLd7.png)
Я создал элемент управления календаря и добавлял номера недель в качестве последнего штриха, и столкнулся с проблемой в каждом примере сценария, который я мог найти на SO и внеТАК (большая часть из которых скопирована с другой).
Проблема в том, что, когда даты попадают в неполные месяцы, подсчет недели, кажется, не работает, и либо продолжаются счета, когда в новоймесяц, или он думает, что последняя полная неделя в предыдущем месяце совпадает с номером первой полной новой недели в следующем месяце.
Ниже приведена визуальная демонстрация одной из библиотек (все они имеют своинеточности, так как они обычно основывают свои расчеты недели на фиксированном числе и строят оттуда):
![enter image description here](https://i.stack.imgur.com/qyUNz.png)
Вы можете посмотреть кодовый блок здесь поскольку проект довольно сложный, у меня есть функция Date.prototype.getWeek
в начале, чтобы поиграть с этим проще.Не стесняйтесь обмениваться любым кодом из примеров, найденных здесь, на SO, так как все они в конечном итоге выходят из строя в течение нескольких месяцев.
Некоторые из используемых расчетов:
При запуске самого последнего примера (2017) из "Получить неделю года в JavaScript, как в PHP", неделя, возвращаемая сейчас, равна 42. Когда вы смотрите в моем календаре, неделя в октябре сейчас отображается как 42, что является правильным согласно здесь https://www.epochconverter.com/weeks/2018.
Учитывая пример, целые недели разделяют один и тот же номер недели, поэтому я не понимаю, насколько точным может быть 42
.
Date.prototype.getWeek = function (dowOffset) {
/*getWeek() was developed by Nick Baicoianu at MeanFreePath: http://www.epoch-calendar.com */
dowOffset = typeof(dowOffset) == 'int' ? dowOffset : 0; //default dowOffset to zero
var newYear = new Date(this.getFullYear(),0,1);
var day = newYear.getDay() - dowOffset; //the day of week the year begins on
day = (day >= 0 ? day : day + 7);
var daynum = Math.floor((this.getTime() - newYear.getTime() -
(this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;
var weeknum;
//if the year starts before the middle of a week
if(day < 4) {
weeknum = Math.floor((daynum+day-1)/7) + 1;
if(weeknum > 52) {
nYear = new Date(this.getFullYear() + 1,0,1);
nday = nYear.getDay() - dowOffset;
nday = nday >= 0 ? nday : nday + 7;
/*if the next year starts before the middle of
the week, it is week #1 of that year*/
weeknum = nday < 4 ? 1 : 53;
}
}
else {
weeknum = Math.floor((daynum+day-1)/7);
}
return weeknum;
};
Вот некоторый код (также пробовал это), это специфично для воскресенья (см. Внизу).Я также вставляю соответствующий фрагмент здесь:
/* For a given date, get the ISO week number
*
* Based on information at:
*
* http://www.merlyn.demon.co.uk/weekcalc.htm#WNR
*
* Algorithm is to find nearest thursday, it's year
* is the year of the week number. Then get weeks
* between that date and the first day of that year.
*
* Note that dates in one year can be weeks of previous
* or next year, overlap is up to 3 days.
*
* e.g. 2014/12/29 is Monday in week 1 of 2015
* 2012/1/1 is Sunday in week 52 of 2011
*/
function getWeekNumber(d) {
// Copy date so don't modify original
d = new Date(Date.UTC(d.getFullYear(), d.getMonth(), d.getDate()));
// Set to nearest Thursday: current date + 4 - current day number
// Make Sunday's day number 7
d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay()||7));
// Get first day of year
var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
// Calculate full weeks to nearest Thursday
var weekNo = Math.ceil(( ( (d - yearStart) / 86400000) + 1)/7);
// Return array of year and week number
return [d.getUTCFullYear(), weekNo];
}