รับสัปดาห์ของปีใน JavaScript เหมือนใน PHP


140

ฉันจะรับหมายเลขประจำสัปดาห์ปัจจุบันของปีเช่น PHP ได้date('W')อย่างไร

ควรเป็นหมายเลขISO-8601สัปดาห์ของปีและสัปดาห์เริ่มต้นในวันจันทร์


1
ดู <a href=" javascript.about.com/library/blweekyear.htm "> <b> ที่นี่ </b> </a> ซึ่งเป็นลิงค์แรกที่ให้เมื่อฉัน googled 'javascript สัปดาห์ของปี'
Pete Wilson

+1 ฮ่า ๆ ! นั่นคือสิ่งที่ฉันได้รับตัวอย่างจากตัวเอง แต่ฉันจำไม่ได้ว่าเป็นแหล่งที่มาเมื่อก่อน
Tom Chantler

@Pete: รหัสนั้นได้รับ 22 เท่ากับสัปดาห์ปัจจุบัน ในขณะที่มันควรจะเป็น 21
PeeHaa

@Pete:: D Nopez ง่าย -1 จะไม่ทำเคล็ดลับ: P ที่จะไม่ได้รับหมายเลข ISO-8601 หนึ่งสัปดาห์ใน ISO-8601 เริ่มในวันจันทร์ สัปดาห์แรกเป็นสัปดาห์ที่มีวันพฤหัสบดีแรกของปี en.wikipedia.org/wiki/ISO-8601 ป.ล. ไม่ใช่ฉันที่ลงคะแนนคุณ
PeeHaa

คำตอบ:


276

คุณควรจะสามารถที่จะได้รับสิ่งที่คุณต้องการที่นี่: http://www.merlyn.demon.co.uk/js-date6.htm#YWD

การเชื่อมโยงที่ดีขึ้นในเว็บไซต์เดียวกันคือการทำงานกับสัปดาห์ที่ผ่านมา

แก้ไข

นี่คือรหัสบางส่วนตามลิงก์ที่ให้ไว้และที่โพสต์ eariler โดย Dommer มันได้รับการทดสอบเบา ๆ กับผลที่http://www.merlyn.demon.co.uk/js-date6.htm#YWD กรุณาทดสอบอย่างละเอียดไม่มีการรับประกัน

แก้ไข 2017

มีปัญหาเกี่ยวกับวันที่ในช่วงเวลาที่สังเกตว่ามีการบันทึกเวลากลางวันและปีที่ 1 มกราคมเป็นวันศุกร์ แก้ไขโดยใช้วิธี UTC ทั้งหมด ต่อไปนี้จะให้ผลลัพธ์ที่เหมือนกันกับ 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]);

ชั่วโมงจะเป็นศูนย์เมื่อสร้างวันที่ "UTC"

ย่อขนาดรุ่นต้นแบบ (ส่งคืนเฉพาะหมายเลขสัปดาห์):

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

ส่วนทดสอบ

ในส่วนนี้คุณสามารถป้อนวันที่ใด ๆ ในรูปแบบ YYYY-MM-DD และตรวจสอบว่ารหัสนี้ให้หมายเลขสัปดาห์เดียวกับหมายเลขสัปดาห์ ISO ของ Moment.js (ทดสอบมากกว่า 50 ปีจากปี 2000 ถึง 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
รหัสนี้จะคำนวณวันที่ 2 มกราคม 2011 เป็นสัปดาห์ที่ 53 ของปี 2010 ซึ่งควรเป็น 52 ทำงานได้อย่างถูกต้องในรหัสต้นฉบับ แต่ไม่ได้อยู่ในการปรับตัวของคุณ
อะลาสแดร์

4
คุณช่วยชีวิตฉันไว้ ขอบคุณ หากคุณต้องการมีส่วนร่วมในโอเพ่นซอร์สฉันขอแนะนำให้คุณสร้างแพทช์สำหรับวิธีการ jQuery UI: $ .datepicker.iso8601Week (วันที่) เพราะมันจะส่งคืนเฉพาะสัปดาห์ แต่ไม่มีปี
คริสเตียน

18
วันนี้ 4 มกราคม 2559 ฉันสังเกตเห็นว่ามันไม่จำเป็นที่จะเพิ่มd.setMilliseconds(0)เช่นกัน - มันแสดงตัวเลขสัปดาห์ที่แตกต่างกันในวันเดียวกันโดยขึ้นอยู่กับว่าฉันใช้วันที่ใหม่ () หรือวันที่ใหม่ ("1/4/2559") เพียงหัวขึ้นสำหรับคนอื่น ๆ ที่อาจมีประสบการณ์เหมือนกัน
ยาโคบ Lauritzen

2
รหัสที่ให้ไม่เป็นไปตามมาตรฐาน ISO 8601 มันปิดโดยหนึ่ง
Eric Grange

2
โอ๊ะคุณพิมพ์ผิดฉันควรจะเป็น '2015-12-30' ซึ่งใช้งานได้
พันธมิตร


26

ดังที่ได้กล่าวไว้ข้างต้น แต่ไม่มีคลาส:

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

4
หนึ่ง ม.ค. ฉุน! * ninja-roll *
CodeManX

2
นี่เป็นคำตอบเดียวที่ดึงหมายเลขสัปดาห์ที่ถูกต้องแม้ในสัปดาห์แรกของปี
PrasadW

หมายเหตุที่ต้องทำ(now.getTime() - onejan.getTime())เพื่อหลีกเลี่ยงปัญหาการสร้าง
Swoox

4
คำถามที่ถามถึง ISO 8601 ซึ่งสิ่งนี้ไม่สนใจ ในฐานะที่เป็นคำตอบสำหรับคำถามมันเป็นเรื่องที่ผิด
havlock

23

Accordily http://javascript.about.com/library/blweekyear.htm

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
รัดกุม แต่ถือว่าวันอาทิตย์เป็นวันแรกของสัปดาห์ดังนั้นวันอาทิตย์ที่ 27 ธันวาคม 2558 เป็นวันแรกของสัปดาห์ 53 แทนที่จะเป็นวันสุดท้ายของสัปดาห์ 52 ซึ่งอาจเหมาะกับบางคน
RobG

3
ฉันคิดว่าเนื่องจากมีการเพิ่มต้นแบบนี้เป็นสิ่งที่คุณคาดหวังว่าวันที่ถือว่าวันอาทิตย์เป็นวันแรก
Ed Sykes

สิ่งนี้จะไม่มีปัญหาในวันที่ปรับเวลาตามฤดูกาลหรือไม่ ฉันคิดว่ามันจะไม่เลื่อนไปจนถึงตีหนึ่งในช่วงฤดูร้อน
Hafthor

นอกจากนี้เทคนิคนี้ไม่ได้เลื่อนสัปดาห์จนกว่า 0: 00: 00.001? ดีกว่าที่จะใช้ Math.floor?
Hafthor

11

ของ Jacob Wright Date.format()ห้องสมุดใช้รูปแบบวันที่ในรูปแบบของdate()ฟังก์ชั่นของ PHP และรองรับหมายเลข ISO-8601 สัปดาห์:

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

มันอาจจะเกินความเป็นไปได้เพียงแค่หนึ่งสัปดาห์ แต่มันรองรับการจัดรูปแบบ PHP และค่อนข้างมีประโยชน์ถ้าคุณทำสิ่งนี้มาก


วิธีแก้ปัญหาที่ดีสำหรับสคริปต์ที่แฮ็กเข้าด้วยกันอย่างรวดเร็ว :)
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;
    }

รหัสต่อไปนี้ไม่ขึ้นกับเขตเวลา (วันที่ UTC ใช้) และทำงานตามhttps://en.wikipedia.org/wiki/ISO_8601


4

ผมพบว่ามีประโยชน์ Java SE ของSimpleDateFormatระดับที่อธิบายในสเปคของออราเคิล: http://goo.gl/7MbCh5 ในกรณีของฉันใน Google Apps Script มันทำงานเช่นนี้:

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

ตัวอย่างเช่นในแมโครสเปรดชีตคุณสามารถดึงเขตเวลาที่แท้จริงของไฟล์:

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

4

สิ่งนี้จะเพิ่มวิธี "getWeek" ใน Date.prototype ซึ่งส่งคืนจำนวนสัปดาห์ตั้งแต่ต้นปี อาร์กิวเมนต์กำหนดวันของสัปดาห์ที่จะต้องพิจารณาก่อน หากไม่มีการโต้เถียงกันวันแรกจะถือว่าวันอาทิตย์

/**
 * 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
สัปดาห์ปฏิทินแรกของปี 2559 เริ่มต้นที่4 มกราคมในประเทศเยอรมนีแต่ฟังก์ชั่นของคุณจะเริ่มนับอีกครั้งตั้งแต่ 0 จากวันที่ 1 มกราคม นอกจากนี้ยังส่งกลับตัวเลขที่ไม่ถูกต้องในตอนท้ายของปีเช่น 52 สำหรับปี 2018-11-31 (สัปดาห์ที่ 53) แม้ว่าจะเป็นสัปดาห์ที่ 1 ของปฏิทินแล้วในปี 2019 : new Date(Date.UTC(2018,11, 31)).getWeek(1)+1(วันจันทร์เป็นวันที่ 1 ของสัปดาห์ในประเทศเยอรมนี)
CodeManX

นั่นเป็นวิธีที่ตั้งใจไว้และนั่นก็คือฉันเชื่อว่าเป็นกรณีการใช้งานที่เป็นไปได้มากที่สุด มิฉะนั้น 3 วันแรกของปี 2559 จะหลุดออกไป วันแรกของเดือนนั้นถือว่าเป็นสัปดาห์แรกของเดือนนั้นไม่ว่าจะเป็นวันไหนและกี่วัน หากคุณต้องการให้ฟังก์ชั่นทำงานแตกต่างกันคุณสามารถปรับแต่งตามความต้องการของคุณ ในทำนองเดียวกันหากหนึ่งสัปดาห์ตกอยู่ในทั้งปีที่กำหนดและปีถัดไปก็สามารถเรียกได้ว่าสัปดาห์สุดท้ายของปีนั้นเช่นเดียวกับสัปดาห์แรกของปีถัดไป (ตามตรรกะปัจจุบัน)
Tigran

ขอบคุณสำหรับข้อมูล. ฉันลงเอยด้วยการใช้โซลูชันของ RobG ซึ่งใช้วันที่ ISO8601 อย่างถูกต้อง (วันสุดท้ายในเดือนธันวาคมและวันแรกในเดือนมกราคมอาจเป็นสัปดาห์ 52, 53 หรือ 1: en.m.wikipedia.org/wiki/ISO_week_date
CodeManX

4

รับจำนวนสัปดาห์ของวันที่ที่กำหนด

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

ตัวอย่าง

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
ฉันไม่อยากจะเชื่อเลย แต่ฟังก์ชั่นนี้เป็นสิ่งเดียวที่ทำงานได้ตลอดเวลา! คำตอบที่ยอมรับจะปรากฏขึ้นเมื่อมันผ่านการประหยัดเวลากลางวันที่ผ่านมาคนอื่น ๆ บอกว่า '0' เป็นตัวเลขสัปดาห์ในบางปี - และบางฟังก์ชั่นอาศัย UTC ซึ่งบางครั้งส่งคืนในวันก่อนหน้าดังนั้นจึงกำหนดให้เป็นสัปดาห์ '53' หรือ '54' แต่น่าเสียดายที่ฉันต้องการสัปดาห์เพื่อเริ่มต้นในวันอาทิตย์และรหัสนี้ยากมากที่จะเข้าใจ ...
Melissa Zachariadis

@MelissaZachariadis กล่าวว่าI need the week to begin on a Sunday; ฉันคิดว่าการเปลี่ยนแปลงที่จำเป็นเพียงอย่างเดียวคือในวันทำงาน () ของวันธรรมดา.getDay()+1ที่จะเปลี่ยนเป็น.getDay()
Rafa

4

รหัสด้านล่างจะคำนวณหมายเลข ISO 8601 สัปดาห์ที่ถูกต้อง มันตรงกับ PHP ของdate("W")ทุกสัปดาห์ระหว่าง 1/1/1970 และ 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);
}

ที่มา: Taco van den Broek


หากคุณไม่ได้ขยายต้นแบบนี่คือฟังก์ชั่น:

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

ตัวอย่างการใช้งาน:

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

ฉันชอบฟังก์ชั่นนี้ แต่ฉันมีคำถาม ฉันจะทำอย่างไรถ้าฉันต้องการคืนกลับเป็นอาทิตย์? ฉันไม่รู้ว่าชิ้น+6 ) % 7ส่วนทำอะไร ขอบคุณจากการขัด!
NoobishPro

1
@Babydead สัปดาห์ ISO เริ่มต้นในวันจันทร์ แต่ JavaScript getDay()เริ่มในวันอาทิตย์ดังนั้นหากคุณต้องการให้เริ่มในวันอาทิตย์คุณสามารถลบการแก้ไขได้:var nDay = date.getDay();
2559

ฉันลองใช้งาน JS มากกว่า 8 แบบเพื่อรับหมายเลขสัปดาห์ นี่เป็นฟังก์ชั่นเดียวที่ใช้งานได้ แต่ถ้าฉันเปลี่ยน getters และ setters ทั้งหมดเป็น getUTC .. และ setUTC .. ไม่รู้ว่าทำไม ฉันกำลังทดสอบสิ่งนี้: 2017-07-17T00: 00: 00.000Z (สัปดาห์ที่ 29) 2017-07-23T23: 59: 59.000Z (สัปดาห์ที่ 29) 2021-01-04T00: 00: 00.000Z (สัปดาห์ที่ 1)
โรคจิต brm


2

ตัวอย่างโค้ดที่ใช้งานได้ดีสำหรับฉันคือรหัสนี้:

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)


1

นี่คือการดำเนินการของฉันสำหรับการคำนวณหมายเลขสัปดาห์ใน JavaScript แก้ไขสำหรับการชดเชยเวลาฤดูร้อนและฤดูหนาวเช่นกัน ฉันใช้คำจำกัดความของสัปดาห์จากบทความนี้: ISO 8601

สัปดาห์มาจากวันจันทร์ถึงวันอาทิตย์และวันที่ 4 มกราคมเป็นสัปดาห์แรกของปีเสมอ

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

สำหรับการทดสอบฉันใช้การทดสอบ 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

จำนวนสัปดาห์นี้เป็นสิ่งที่เจ็บปวดอย่างมากในการ ** สคริปต์ส่วนใหญ่ทั่วเน็ตไม่ได้ผลสำหรับฉัน พวกเขาทำงานเกือบตลอดเวลา แต่ทุกคนยากจนในบางจุดโดยเฉพาะอย่างยิ่งเมื่อปีเปลี่ยนไปและสัปดาห์สุดท้ายของปีเป็นสัปดาห์แรกของปีถัดไปอย่างกระทันหันเป็นต้นแม้แต่ตัวกรองวันที่ของ 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);
};

ฉันได้ทำการทดสอบและดูเหมือนว่าจะทำงานได้ดี แต่ถ้าคุณสังเกตเห็นข้อบกพร่องในนั้นโปรดแจ้งให้เราทราบ


0

ฉันพยายามมากที่จะได้รหัสที่สั้นที่สุดเพื่อให้ได้มาตรฐาน 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

วิธีแก้ปัญหาสั้นที่สุดสำหรับAngular2 + DatePipe ปรับสำหรับ 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;
}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.