Nhận tuần trong năm bằng JavaScript như trong PHP


140

Làm cách nào để có được số tuần hiện tại trong năm, như của PHP date('W')?

Nó phải là số tuần ISO-8601 của năm, tuần bắt đầu vào thứ Hai.


1
Hãy xem <a href=" javascript.about.com/l Library/blweekyear.htmlm "> <b> tại đây </ b> </a>, đây là liên kết đầu tiên được đưa ra khi tôi googled 'tuần javascript trong năm'.
Pete Wilson

+1 Lol! Đó là nơi tôi đã lấy đoạn trích từ chính mình, nhưng tôi không thể nhớ nguồn này khi tôi đã nhận được nó một lúc trước.
Tom Chantler

@Pete: Mã đó được 22 như tuần hiện tại. Trong khi nó phải là 21
PeeHaa

@Pete :: D Nopez a -1 đơn giản sẽ không thực hiện mẹo: P Điều đó sẽ không nhận được số tuần của ISO-8601. Một tuần trong ISO-8601 bắt đầu vào thứ hai. Tuần đầu tiên là tuần có năm thứ năm đầu tiên trong năm. vi.wikipedia.org/wiki/ISO-8601 . PS không phải là tôi đã đánh giá thấp bạn.
PeeHaa

Câu trả lời:


276

Bạn sẽ có thể có được những gì bạn muốn ở đây: http://www.merlyn.demon.co.uk/js-date6.htm#YWD .

Một liên kết tốt hơn trên cùng một trang là: Làm việc với nhiều tuần .

Biên tập

Dưới đây là một số mã dựa trên các liên kết được cung cấp và tai nghe được đăng bởi Dommer. Nó đã được thử nghiệm nhẹ so với kết quả tại http://www.merlyn.demon.co.uk/js-date6.htm#YWD . Vui lòng kiểm tra kỹ lưỡng, không có đảm bảo cung cấp.

Chỉnh sửa 2017

Có một vấn đề với ngày trong khoảng thời gian mà việc tiết kiệm ánh sáng ban ngày được quan sát và những năm mà ngày 1 tháng 1 là thứ Sáu. Đã sửa bằng cách sử dụng tất cả các phương pháp UTC. Sau đây trả về kết quả giống hệt với Moment.js.

/* 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];
}

var result = getWeekNumber(new Date());
document.write('It\'s currently week ' + result[1] + ' of ' + result[0]);

Giờ là 0 khi tạo ngày "UTC".

Thu nhỏ, phiên bản nguyên mẫu (chỉ trả về số tuần):

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

document.write('The current ISO week number is ' + new Date().getWeekNumber());

Phần kiểm tra

Trong phần này, bạn có thể nhập bất kỳ ngày nào ở định dạng YYYY-MM-DD và kiểm tra xem mã này có cùng số tuần với số tuần ISO của ISO.js (được thử nghiệm trong hơn 50 năm từ 2000 đến 2050).

Date.prototype.getWeekNumber = function(){
  var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
  var dayNum = d.getUTCDay() || 7;
  d.setUTCDate(d.getUTCDate() + 4 - dayNum);
  var yearStart = new Date(Date.UTC(d.getUTCFullYear(),0,1));
  return Math.ceil((((d - yearStart) / 86400000) + 1)/7)
};

function checkWeek() {
  var s = document.getElementById('dString').value;
  var m = moment(s, 'YYYY-MM-DD');
  document.getElementById('momentWeek').value = m.format('W');
  document.getElementById('answerWeek').value = m.toDate().getWeekNumber();      
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Enter date  YYYY-MM-DD: <input id="dString" value="2021-02-22">
<button onclick="checkWeek(this)">Check week number</button><br>
Moment: <input id="momentWeek" readonly><br>
Answer: <input id="answerWeek" readonly>


8
Mã này tính ngày 2 tháng 1 năm 2011 là tuần thứ 53 của năm 2010, trong đó nó phải là thứ 52. Điều này hoạt động chính xác trong mã gốc nhưng không phải trong sự thích ứng của bạn.
Alasdair

4
Bạn đã lưu mông của tôi. Cảm ơn. Nếu bạn muốn đóng góp cho Nguồn mở, tôi khuyên bạn nên tạo một bản vá cho phương thức UI UI: $ .datepicker.iso8601Week (ngày) vì nó chỉ trả về tuần Không, nhưng không có năm.
Christian

18
Hôm nay, ngày 4 tháng 1 năm 2016, tôi nhận thấy rằng cũng cần phải thêm d.setMilliseconds(0)vào - nó tiếp tục hiển thị các số tuần khác nhau cho cùng một ngày tùy thuộc vào việc tôi đã sử dụng Ngày mới () hay Ngày mới ("1/4/2016"). Chỉ cần một cái đầu cho những người khác có thể trải nghiệm tương tự.
Jacob Lauritzen

2
Mã được cung cấp không tuân theo ISO 8601, nó bị tắt bởi một
Eric Grange

2
Rất tiếc, lỗi chính tả của tôi, được cho là '2015-12-30' hoạt động.
minh


25

Như đã nói ở trên nhưng không có lớp:

let now = new Date();
let onejan = new Date(now.getFullYear(), 0, 1);
week = Math.ceil( (((now - onejan) / 86400000) + onejan.getDay() + 1) / 7 );

4
một-jan-tang! * ninja-roll *
CodeManX

2
Đây là câu trả lời duy nhất lấy số tuần chính xác ngay cả trong tuần đầu tiên của năm.
PrasadW

Lưu ý làm (now.getTime() - onejan.getTime())để tránh các vấn đề xây dựng.
Swoox

4
Câu hỏi yêu cầu ISO 8601 mà điều này bỏ qua. Như một câu trả lời cho câu hỏi, nó đơn giản là sai
havlock

23

Chính xác http://javascript.about.com/l Library / blweekyear.htmlm

Date.prototype.getWeek = function() {
    var onejan = new Date(this.getFullYear(),0,1);
    var millisecsInDay = 86400000;
    return Math.ceil((((this - onejan) /millisecsInDay) + onejan.getDay()+1)/7);
};

1
Súc tích, nhưng coi Chủ nhật là ngày đầu tuần nên Chủ nhật 27 tháng 12 năm 2015 là ngày đầu tiên của tuần 53 chứ không phải là ngày cuối cùng của tuần 52. Điều đó có thể phù hợp với một số người.
RobG

3
Tôi nghĩ vì điều này đang được thêm vào nguyên mẫu, đó là những gì bạn mong đợi vì Ngày coi chủ nhật là ngày đầu tiên.
Ed Sykes

Điều này có vấn đề gì trong những ngày tiết kiệm ánh sáng ban ngày không? Tôi nghĩ rằng nó sẽ không tiến tới 1 giờ sáng trong suốt mùa hè.
Hafthor

Ngoài ra, về mặt kỹ thuật không tiến bộ trong tuần cho đến 0: 00: 00.001? Sử dụng Math.floor tốt hơn?
Hafthor

11

Date.format()Thư viện của Jacob Wright thực hiện định dạng ngày theo kiểu date()chức năng của PHP và hỗ trợ số tuần ISO-8601:

new Date().format('W');

Nó có thể hơi quá mức cho một số tuần, nhưng nó hỗ trợ định dạng kiểu PHP và khá tiện dụng nếu bạn sẽ làm nhiều việc này.


Giải pháp tốt cho các kịch bản hack cùng nhau nhanh chóng :)
Steen Schütt

6
getWeekOfYear: function(date) {
        var target = new Date(date.valueOf()),
            dayNumber = (date.getUTCDay() + 6) % 7,
            firstThursday;

        target.setUTCDate(target.getUTCDate() - dayNumber + 3);
        firstThursday = target.valueOf();
        target.setUTCMonth(0, 1);

        if (target.getUTCDay() !== 4) {
            target.setUTCMonth(0, 1 + ((4 - target.getUTCDay()) + 7) % 7);
        }

        return Math.ceil((firstThursday - target) /  (7 * 24 * 3600 * 1000)) + 1;
    }

Mã sau là độc lập múi giờ (ngày UTC được sử dụng) và hoạt động theo https://en.wikipedia.org/wiki/ISO_8601


4

Tôi thấy hữu ích lớp SimpleDateFormat của Java SE được mô tả trên đặc tả của Oracle: http://goo.gl/7MbCh5 . Trong trường hợp của tôi trong Google Apps Script, nó hoạt động như thế này:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), "GMT", "w"));
  Logger.log(weekNum);
}

Ví dụ: trong macro bảng tính, bạn có thể truy xuất múi giờ thực của tệp:

function getWeekNumber() {
  var weekNum = parseInt(Utilities.formatDate(new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "w"));
  Logger.log(weekNum);
}

4

Điều này thêm phương thức "getWeek" vào Date.prototype, trả về số tuần từ đầu năm. Đối số xác định ngày nào trong tuần để xem xét đầu tiên. Nếu không có đối số nào được thông qua, ngày đầu tiên được giả định vào Chủ nhật.

/**
 * Get week number in the year.
 * @param  {Integer} [weekStart=0]  First day of the week. 0-based. 0 for Sunday, 6 for Saturday.
 * @return {Integer}                0-based number of week.
 */
Date.prototype.getWeek = function(weekStart) {
    var januaryFirst = new Date(this.getFullYear(), 0, 1);
    if(weekStart !== undefined && (typeof weekStart !== 'number' || weekStart % 1 !== 0 || weekStart < 0 || weekStart > 6)) {
      throw new Error('Wrong argument. Must be an integer between 0 and 6.');
    }
    weekStart = weekStart || 0;
    return Math.floor((((this - januaryFirst) / 86400000) + januaryFirst.getDay() - weekStart) / 7);
};

1
Tuần dương lịch đầu tiên của năm 2016 bắt đầu vào ngày 4 tháng 1 tại Đức , nhưng chức năng của bạn bắt đầu đếm lại từ 0 từ ngày 1 tháng 1 trở đi. Nó cũng trả về các số sai vào cuối năm, ví dụ 52 cho 2018-11-31 (tuần thứ 53), mặc dù đó đã là tuần đầu tiên của năm 2019 : new Date(Date.UTC(2018,11, 31)).getWeek(1)+1(Thứ Hai là ngày đầu tiên của Đức).
CodeManX

Đó là cách nó được dự định, và đó là, tôi tin rằng, trường hợp sử dụng rất có thể. Nếu không thì 3 ngày đầu năm 2016 sẽ rơi ra. Những ngày đầu tiên của tháng được coi là bao gồm tuần đầu tiên của tháng đó, bất kể là ngày nào và có bao nhiêu ngày. Nếu bạn cần chức năng để hoạt động khác nhau, bạn có thể điều chỉnh nó theo nhu cầu của bạn. Tương tự như vậy, nếu một tuần rơi vào cả năm nhất định và năm sau, thì đó có thể được gọi là tuần cuối cùng của năm đó, cũng như tuần đầu tiên của năm sau (theo logic hiện tại).
Tigran

Cảm ơn bạn về thông tin. Tôi đã kết thúc bằng cách sử dụng giải pháp của RobG, thực hiện chính xác các ngày trong tuần ISO8601 (những ngày cuối tháng 12 và những ngày đầu tiên trong tháng 1 có thể thuộc về tuần 52, 53 hoặc 1: en.m.wikipedia.org/wiki/ISO_week_date
CodeManX

4

Lấy số tuần của bất kỳ ngày nào

function week(year,month,day) {
    function serial(days) { return 86400000*days; }
    function dateserial(year,month,day) { return (new Date(year,month-1,day).valueOf()); }
    function weekday(date) { return (new Date(date)).getDay()+1; }
    function yearserial(date) { return (new Date(date)).getFullYear(); }
    var date = year instanceof Date ? year.valueOf() : typeof year === "string" ? new Date(year).valueOf() : dateserial(year,month,day), 
        date2 = dateserial(yearserial(date - serial(weekday(date-serial(1))) + serial(4)),1,3);
    return ~~((date - date2 + serial(weekday(date2) + 5))/ serial(7));
}

Thí dụ

console.log(
    week(2016, 06, 11),//23
    week(2015, 9, 26),//39
    week(2016, 1, 1),//53
    week(2016, 1, 4),//1
    week(new Date(2016, 0, 4)),//1
    week("11 january 2016")//2
);

1
Tôi không thể tin được, nhưng chức năng này là duy nhất hoạt động mọi lúc! Câu trả lời được chấp nhận đã phát lên khi nó đi qua tiết kiệm ánh sáng ban ngày, những người khác nói "0" là số tuần trong một số năm nhất định. - và một số dựa vào các chức năng UTC đôi khi trả về ngày hôm trước do đó chỉ định tuần '53' hoặc '54'. Thật không may, tôi cần một tuần để bắt đầu vào Chủ nhật và mã này rất khó hiểu ...
Melissa Zachariadis

@MelissaZachariadis nói I need the week to begin on a Sunday; Tôi nghĩ rằng sự thay đổi cần thiết duy nhất là trong chức năng của ngày trong tuần () .getDay()+1sẽ được thay đổi thành.getDay()
Rafa

4

Mã dưới đây tính toán số tuần ISO 8601 chính xác. Nó phù hợp với PHP date("W")cho mỗi tuần trong khoảng thời gian từ 1/1/1970 đến 1/1/2100.

/**
 * Get the ISO week date week number
 */
Date.prototype.getWeek = function () {
  // Create a copy of this date object
  var target = new Date(this.valueOf());

  // ISO week date weeks start on Monday, so correct the day number
  var dayNr = (this.getDay() + 6) % 7;

  // ISO 8601 states that week 1 is the week with the first Thursday of that year
  // Set the target date to the Thursday in the target week
  target.setDate(target.getDate() - dayNr + 3);

  // Store the millisecond value of the target date
  var firstThursday = target.valueOf();

  // Set the target to the first Thursday of the year
  // First, set the target to January 1st
  target.setMonth(0, 1);

  // Not a Thursday? Correct the date to the next Thursday
  if (target.getDay() !== 4) {
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
  }

  // The week number is the number of weeks between the first Thursday of the year
  // and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
  return 1 + Math.ceil((firstThursday - target) / 604800000);
}

Nguồn: Taco van den Broek


Nếu bạn không mở rộng các nguyên mẫu, thì đây là một chức năng:

function getWeek(date) {
  if (!(date instanceof Date)) date = new Date();

  // ISO week date weeks start on Monday, so correct the day number
  var nDay = (date.getDay() + 6) % 7;

  // ISO 8601 states that week 1 is the week with the first Thursday of that year
  // Set the target date to the Thursday in the target week
  date.setDate(date.getDate() - nDay + 3);

  // Store the millisecond value of the target date
  var n1stThursday = date.valueOf();

  // Set the target to the first Thursday of the year
  // First, set the target to January 1st
  date.setMonth(0, 1);

  // Not a Thursday? Correct the date to the next Thursday
  if (date.getDay() !== 4) {
    date.setMonth(0, 1 + ((4 - date.getDay()) + 7) % 7);
  }

  // The week number is the number of weeks between the first Thursday of the year
  // and the Thursday in the target week (604800000 = 7 * 24 * 3600 * 1000)
  return 1 + Math.ceil((n1stThursday - date) / 604800000);
}

Sử dụng mẫu:

getWeek(); // Returns 37 (or whatever the current week is)
getWeek(new Date('Jan 2, 2011')); // Returns 52
getWeek(new Date('Jan 1, 2016')); // Returns 53
getWeek(new Date('Jan 4, 2016')); // Returns 1

Tôi thích chức năng này, nhưng tôi có một câu hỏi; Tôi phải làm gì nếu tôi muốn đưa nó trở lại chủ nhật? Tôi không có ý tưởng gì về +6 ) % 7phần này. Cảm ơn từ một chà!
NoobishPro

1
@Babydead Tuần ISO bắt đầu vào thứ Hai, nhưng JavaScript getDay()bắt đầu vào Chủ nhật, vì vậy nếu bạn muốn nó bắt đầu vào Chủ nhật thì bạn có thể xóa phần chỉnh sửa:var nDay = date.getDay();
thdoan

Tôi đã thử hơn 8 cách triển khai JS khác nhau để lấy số tuần. Đây là chức năng duy nhất hoạt động, nhưng chỉ khi tôi thay đổi tất cả các getters và setters thành getUTC .. và setUTC .. Không biết tại sao. Tôi đã thử nghiệm với điều này: 2017-07-17T00: 00: 00.000Z (tuần 29) 2017-07-23T23: 59: 59.000Z (tuần 29) 2021-01-04T00: 00: 00.000Z (tuần 1)
psycho BRM


2

Đoạn mã hoạt động khá tốt đối với tôi là đoạn mã này:

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();

Lưu ý:
dlà Ngày của tôi mà tôi muốn số tuần hiện tại.
Việc +chuyển đổi Ngày thành số (làm việc với TypeScript).


1

Đây là cách triển khai của tôi để tính số tuần trong JavaScript. sửa chữa cho thời gian nghỉ hè và mùa đông là tốt. Tôi đã sử dụng định nghĩa của tuần từ bài viết này: ISO 8601

Tuần là từ thứ hai đến chủ nhật, và ngày 4 tháng 1 luôn luôn trong tuần đầu tiên của năm.

// add get week prototype functions
// weeks always start from monday to sunday
// january 4th is always in the first week of the year
Date.prototype.getWeek = function () {
    year = this.getFullYear();
    var currentDotw = this.getWeekDay();
    if (this.getMonth() == 11 && this.getDate() - currentDotw > 28) {
        // if true, the week is part of next year 
        return this.getWeekForYear(year + 1);
    }
    if (this.getMonth() == 0 && this.getDate() + 6 - currentDotw < 4) {
        // if true, the week is part of previous year
        return this.getWeekForYear(year - 1);
    }
    return this.getWeekForYear(year);
}

// returns a zero based day, where monday = 0
// all weeks start with monday
Date.prototype.getWeekDay = function () {
    return  (this.getDay() + 6) % 7;
}

// corrected for summer/winter time
Date.prototype.getWeekForYear = function (year) {
    var currentDotw = this.getWeekDay();
    var fourjan = new Date(year, 0, 4);
    var firstDotw = fourjan.getWeekDay();
    var dayTotal = this.getDaysDifferenceCorrected(fourjan) // the difference in days between the two dates.
    // correct for the days of the week
    dayTotal += firstDotw; // the difference between the current date and the first monday of the first week, 
    dayTotal -= currentDotw; // the difference between the first monday and the current week's monday
    // day total should be a multiple of 7 now
    var weeknumber = dayTotal / 7 + 1; // add one since it gives a zero based week number.
    return weeknumber;
}

// corrected for timezones and offset
Date.prototype.getDaysDifferenceCorrected = function (other) {
    var millisecondsDifference = (this - other);
    // correct for offset difference. offsets are in minutes, the difference is in milliseconds
    millisecondsDifference += (other.getTimezoneOffset()- this.getTimezoneOffset()) * 60000;
    // return day total. 1 day is 86400000 milliseconds, floor the value to return only full days
    return Math.floor(millisecondsDifference / 86400000);
}

để thử nghiệm tôi đã sử dụng các thử nghiệm JavaScript sau trong 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

Điều số tuần này đã là một nỗi đau thực sự trong một **. Hầu hết các kịch bản trên mạng không làm việc cho tôi. Họ làm việc hầu hết thời gian nhưng tất cả đều bị hỏng ở một số điểm, đặc biệt là khi năm thay đổi và tuần trước của năm đột nhiên vào tuần đầu tiên, v.v. Ngay cả bộ lọc ngày của Angular cho thấy dữ liệu không chính xác (đó là tuần đầu tiên của năm tới, góc cạnh đã cho tuần 53).

Lưu ý: Ví dụ được thiết kế để hoạt động với các tuần ở Châu Âu (Thứ nhất trước tiên)!

nhận được ()

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;
}

getDay Index ()

/*
* 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);
};

Tôi đã thử nghiệm điều này và nó dường như đang hoạt động rất tốt nhưng nếu bạn nhận thấy một lỗ hổng trong nó, xin vui lòng cho tôi biết.


0

Tôi đã cố gắng rất nhiều để có được mã ngắn nhất để có được sự tuân thủ ISO hàng tuần.

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();}

Các biến datelà cần thiết để tránh để thay đổi bản gốc this. Tôi đã sử dụng các giá trị trả về setDate()setMonth()để phân phối getTime()để tiết kiệm độ dài mã và tôi đã sử dụng một số cấp số trong một phần nghìn giây của một ngày thay vì nhân các phần tử đơn lẻ hoặc một số có năm số không. thislà Ngày hoặc Số mili giây, giá trị trả về là String"49/2017".



0

Một tùy chọn dựa trên thư viện: sử dụng d3-time-format:

const formatter = d3.timeFormat('%U');
const weekNum = formatter(new Date());

0

Cách giải quyết ngắn nhất cho Angular2 + DatePipe, được điều chỉnh cho ISO-8601:

import {DatePipe} from "@angular/common";

public rightWeekNum: number = 0;
  
constructor(private datePipe: DatePipe) { }
    
calcWeekOfTheYear(dateInput: Date) {
  let falseWeekNum = parseInt(this.datePipe.transform(dateInput, 'ww'));
  this.rightWeekNum = falseWeekNum ? falseWeekNum : falseWeekNum-1;
}

-1
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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.