Получите неделю года в JavaScript как в PHP - PullRequest
120 голосов
/ 25 мая 2011

Как узнать текущий номер недели в году, например, PHP date('W')?

Это должен быть ISO-8601 номер недели в году, начиная с понедельника.

Ответы [ 16 ]

2 голосов
/ 07 апреля 2016

Если вы уже участвуете в проекте Angular, вы можете использовать $filter('date').

Например:

var myDate = new Date();
var myWeek = $filter('date')(myDate, 'ww');
1 голос
/ 28 декабря 2016

Вот моя реализация для расчета номера недели в JavaScript.с поправкой на летнее и зимнее время.Я использовал определение недели из этой статьи: ISO 8601

Недели с понедельника по воскресенье, а 4 января всегда в первую неделю года.*

для тестирования я использовал следующие тесты JavaScript в Qunit

var runweekcompare = function(result, expected) {
    equal(result, expected,'Week nr expected value: ' + expected + ' Actual value: ' + result);
}

test('first week number test', function () {
    expect(5);
    var temp = new Date(2016, 0, 4); // is the monday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 4, 23, 50); // is the monday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 10, 23, 50); // is the sunday of the first week of the year
    runweekcompare(temp.getWeek(), 1);
    var temp = new Date(2016, 0, 11, 23, 50); // is the second week of the year
    runweekcompare(temp.getWeek(), 2);
    var temp = new Date(2016, 1, 29, 23, 50); // is the 9th week of the year
    runweekcompare(temp.getWeek(), 9);
});

test('first day is part of last years last week', function () {
    expect(2);
    var temp = new Date(2016, 0, 1, 23, 50); // is the first last week of the previous year
    runweekcompare(temp.getWeek(), 53);
    var temp = new Date(2011, 0, 2, 23, 50); // is the first last week of the previous year
    runweekcompare(temp.getWeek(), 52);
});

test('last  day is part of next years first week', function () {
    var temp = new Date(2013, 11, 30); // is part of the first week of 2014
    runweekcompare(temp.getWeek(), 1);
});

test('summer winter time change', function () {
    expect(2);
    var temp = new Date(2000, 2, 26); 
    runweekcompare(temp.getWeek(), 12);
    var temp = new Date(2000, 2, 27); 
    runweekcompare(temp.getWeek(), 13);
});

test('full 20 year test', function () {
    //expect(20 * 12 * 28 * 2);
    for (i = 2000; i < 2020; i++) {
        for (month = 0; month < 12; month++) {
            for (day = 1; day < 29 ; day++) {
                var temp = new Date(i, month, day);
                var expectedweek = temp.getWeek();
                var temp2 = new Date(i, month, day, 23, 50);
                var resultweek = temp.getWeek();
                equal(expectedweek, Math.round(expectedweek), 'week number whole number expected ' + Math.round(expectedweek) + ' resulted week nr ' + expectedweek);
                equal(resultweek, expectedweek, 'Week nr expected value: ' + expectedweek + ' Actual value: ' + resultweek + ' for year ' + i + ' month ' + month + ' day ' + day);
            }
        }
    }
});
0 голосов
/ 03 октября 2018

Фрагмент кода, который очень хорошо работает для меня, это:

var yearStart = +new Date(d.getFullYear(), 0, 1);
var today = +new Date(d.getFullYear(),d.getMonth(),d.getDate());
var dayOfYear = ((today - yearStart + 1) / 86400000);
return Math.ceil(dayOfYear / 7).toString();

Примечание:
d - это моя Дата, для которой я хочу номер текущей недели.
+ преобразует Даты в числа (работает с TypeScript).

0 голосов
/ 08 декабря 2017

Я очень старался получить самый короткий код, чтобы получить ISO-номер недели.

Date.prototype.getWeek=function(){
    var date=new Date(this);
    date.setHours(0,0,0,0);
    return Math.round(((date.setDate(this.getDate()+2-(this.getDay()||7))-date.setMonth(0,4))/8.64e7+3+(date.getDay()||7))/7)+"/"+date.getFullYear();}

Переменная date необходима, чтобы избежать изменения оригинала this. Я использовал возвращаемые значения setDate() и setMonth(), чтобы обойтись без getTime(), чтобы сохранить длину кода, и я использовал экспоненциальное число для миллисекунд дня вместо умножения отдельных элементов или числа с пятью нулями. this - это Дата или Количество миллисекунд, возвращаемое значение - String, например. "49/2017".

0 голосов
/ 10 декабря 2016
now = new Date();
today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
firstOfYear = new Date(now.getFullYear(), 0, 1);
numOfWeek = Math.ceil((((today - firstOfYear) / 86400000)-1)/7);
0 голосов
/ 12 ноября 2016

На этой неделе номер был настоящей болью в а **. Большинство сценариев в сети не работает для меня. Они работали большую часть времени, но в какой-то момент все они сломались, особенно когда год изменился, а последняя неделя года внезапно стала первой неделей следующего года и т. Д. Даже фильтр даты Angular показал неверные данные (это была 1-я неделя следующего года, angular дал неделя 53).

Примечание: Примеры предназначены для работы с европейскими неделями (сначала понедельник)!

getWeek ()

Date.prototype.getWeek = function(){

    // current week's Thursday
    var curWeek = new Date(this.getTime());
        curWeek.setDay(4);

    // Get year's first week's Thursday
    var firstWeek = new Date(curWeek.getFullYear(), 0, 4);
        firstWeek.setDay(4);

    return (curWeek.getDayIndex() - firstWeek.getDayIndex()) / 7 + 1;
};

setDay ()

/**
* Make a setDay() prototype for Date
* Sets week day for the date
*/
Date.prototype.setDay = function(day){

    // Get day and make Sunday to 7
    var weekDay = this.getDay() || 7;
    var distance = day - weekDay;
    this.setDate(this.getDate() + distance);

    return this;
}

getDayIndex ()

/*
* Returns index of given date (from Jan 1st)
*/

Date.prototype.getDayIndex = function(){
    var start = new Date(this.getFullYear(), 0, 0);
    var diff = this - start;
    var oneDay = 86400000;

    return Math.floor(diff / oneDay);
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...