Cách nhận ngày đầu tiên và ngày cuối cùng trong tuần trong JavaScript


94

Tôi có today = new Date();đối tượng. Tôi cần xem ngày đầu tiên và ngày cuối cùng của tuần hiện tại. Tôi cần cả hai biến thể cho Chủ Nhật và Thứ Hai làm ngày bắt đầu và kết thúc trong tuần. Bây giờ tôi hơi nhầm lẫn với một mã. Bạn có thể giúp tôi?

Câu trả lời:


189
var curr = new Date; // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6

var firstday = new Date(curr.setDate(first)).toUTCString();
var lastday = new Date(curr.setDate(last)).toUTCString();

firstday
"Sun, 06 Mar 2011 12:25:40 GMT"
lastday
"Sat, 12 Mar 2011 12:25:40 GMT"

Điều này hoạt động cho ngày đầu tiên = chủ nhật của tuần này và ngày trước = ngày thứ bảy cho tuần này. Việc mở rộng nó để chạy từ Thứ Hai đến Chủ Nhật là một việc nhỏ.

Làm cho nó hoạt động với ngày đầu tiên và ngày cuối cùng trong các tháng khác nhau là một bài tập cho người dùng


cảm ơn, làm thế nào tôi có thể làm cho điều này nhưng khi ngày đầu tiên là thứ hai?
JuanPablo

4
var first = curr.getDate() - curr.getDay() +1;
JuanPablo

40
Để làm cho nó làm việc khi bạn có tháng khác nhau -var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N

2
Một mã tương tự như câu trả lời @Rayons, nhưng điều này làm việc sẽ cho thậm chí cho các tháng khác và năm cũng var curr = new Date('2014-10-01T00:00:00'); // get current date var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week var last = first + 6; // last day is the first day + 6 firstday = new Date(curr.setDate(first)).toUTCString(); lastday = new Date(curr.setDate(curr.getDate()+6)).toUTCString(); chỉ tôi đã sửa chữa các @ đang RichardN, mà là có một sai lầm nhỏ
Azeez

60
"như một bài tập cho người dùng" ... thực sự?
adius

62

Hãy cẩn thận với câu trả lời được chấp nhận, nó không đặt thời gian là 00:00:00 và 23:59:59, vì vậy bạn có thể gặp vấn đề.

Tôi khuyên bạn nên sử dụng Moment.js để xử lý ngày tháng. Đối với trường hợp của bạn:

var startOfWeek = moment().startOf('week').toDate();
var endOfWeek   = moment().endOf('week').toDate();

Đây chỉ là một use case nhỏ, thực sự rất đơn giản để thực hiện rất nhiều thao tác phức tạp.

Bạn có thể xem tìm hiểu thêm tại đây: http://momentjs.com/


19
Nếu bạn sử dụng sử dụng thời điểm "isoweek" thay vì "tuần", nếu không, tuần này sẽ bắt đầu tuần từ chủ nhật và sẽ kết thúc tuần đó bằng thứ bảy var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo

Cảm ơn các bạn đã tiết kiệm thời gian của tôi :-)
Syed Ehtsham Abbas

1
Để tính toán thời gian không sử dụng moment.js, hãy sử dụng Date.setHours: curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur

là phải 'isoWeek' không 'isoweek'
Mayur saner

Khoảnh khắc tình yêu js, một trong những ngày / giờ tuyệt vời nhất ngoài kia!
Vippy

50

Bạn cũng có thể sử dụng các dòng mã sau để lấy ngày đầu tiên và ngày cuối cùng trong tuần:

var curr = new Date;
var firstday = new Date(curr.setDate(curr.getDate() - curr.getDay()));
var lastday = new Date(curr.setDate(curr.getDate() - curr.getDay()+6));

Hy vọng nó sẽ hữu ích ..


2
Có, Nhưng @totymedii, câu trả lời của Raynos là sai cho ngày 1 tháng 3 năm 2019, tôi có bằng chứng về điều đó, ngày đầu tiên :: Chủ nhật, ngày 24 tháng 2 năm 2019 08:33:48 GMT ngày trước :: Thứ bảy, 02 tháng 2 năm 2019 08:33:48 GMT
Deepak Patel

14

Đây là một cách nhanh chóng để có được ngày đầu tiên và ngày cuối cùng, cho bất kỳ ngày bắt đầu nào. biết rằng:

1 ngày = 86.400.000 mili giây.

Giá trị ngày JS tính bằng mili giây

Công thức: tìm ra số ngày bạn cần xóa để có ngày bắt đầu trong tuần của bạn (nhân với giá trị mili giây của 1 ngày). Tất cả những gì còn lại sau đó là thêm 6 ngày để có ngày kết thúc của bạn.

var startDay = 1; //0=sunday, 1=monday etc.
var d = now.getDay(); //get the current day
var weekStart = new Date(now.valueOf() - (d<=0 ? 7-startDay:d-startDay)*86400000); //rewind to start day
var weekEnd = new Date(weekStart.valueOf() + 6*86400000); //add 6 days to get last day

3
Điều này không làm việc vì ngày này là không phải lúc nào 86.400.000 mili giây nhờ dài để DST ...
ValarDohaeris

9

Thư viện date-fns tuyệt vời (và không thể thay đổi) xử lý điều này một cách ngắn gọn nhất:

const start = startOfWeek(date);
const end = endOfWeek(date);

Ngày bắt đầu mặc định của tuần là Chủ nhật (0), nhưng nó có thể được thay đổi thành Thứ Hai (1) như sau:

const start = startOfWeek(date, {weekStartsOn: 1});
const end = endOfWeek(date, {weekStartsOn: 1});

1
cộng 1 để sử dụng date-fns chứ không phải thời điểm
CENT1PEDE,

@RobG Bất kỳ phương pháp nào bạn sử dụng sẽ có một ngày đầu tuần mặc định.
Freewalker

4

Bạn có thể làm điều gì đó như thế này

var today = new Date();
var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (7 - today.getDay() - startDay) % 7);

Trong đó startDaymột số từ 0 đến 6 trong đó 0 là viết tắt của Chủ nhật (tức là 1 = Thứ Hai, 2 = Thứ Ba, v.v.).


3

SetDatesẽ đặt ngày trong tháng. Sử dụng setDatetrong thời gian đầu và cuối tháng, sẽ bị sai tuần

var curr = new Date("08-Jul-2014"); // get current date
var first = curr.getDate() - curr.getDay(); // First day is the day of the month - the day of the week
var last = first + 6; // last day is the first day + 6
var firstday = new Date(curr.setDate(first)); // 06-Jul-2014
var lastday = new Date(curr.setDate(last)); //12-Jul-2014

Nếu bạn đặt Ngày là 01-07-2014, nó sẽ hiển thị ngày đầu tiên là 29-06-2014 và ngày cuối cùng là 05-06-2014 thay vì 05-07-2014

Vì vậy, khắc phục vấn đề này tôi đã sử dụng

var curr = new Date();
day = curr.getDay();
firstday = new Date(curr.getTime() - 60*60*24* day*1000); //will return firstday (ie sunday) of the week
lastday = new Date(curr.getTime() + 60 * 60 *24 * 6 * 1000); //adding (60*60*6*24*1000) means adding six days to the firstday which results in lastday (saturday) of the week

" Sử dụng setDate trong khi bắt đầu và cuối tháng, sẽ dẫn đến sai tuần " nếu không được sử dụng đúng cách.
RobG

3

Điều này hoạt động qua các thay đổi hàng năm và hàng tháng.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay())));
}

Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +6)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Bây giờ điều đó có vẻ thừa. smh
Chris Lang

Và cho các tuần bắt đầu vào thứ Hai?
RobG

@RobG Vui lòng tham khảo điều này
SHIVA

2

Tôi khuyên bạn nên sử dụng Moment.js cho những trường hợp như vậy. Tôi đã có các tình huống trong đó tôi phải kiểm tra thời gian ngày hiện tại, tuần này, tháng này và ngày tháng quý này. Ở trên một câu trả lời đã giúp tôi nên tôi nghĩ cũng chia sẻ phần còn lại của các chức năng.

Đơn giản chỉ để lấy ngày giờ hiện tại ở định dạng cụ thể

        case 'Today':
        moment().format("DD/MM/YYYY h:mm A");

        case 'This Week':
          moment().endOf('isoweek').format("DD/MM/YYYY h:mm A");

Tuần bắt đầu từ Chủ nhật và kết thúc vào thứ Bảy nếu chúng ta chỉ sử dụng 'week' làm tham số cho hàm endOf nhưng để lấy Chủ nhật là cuối tuần, chúng ta cần sử dụng 'isoweek'.

        case 'This Month':
          moment().endOf('month').format("DD/MM/YYYY h:mm A");

        case 'This Quarter':
          moment().endOf('quarter').format("DD/MM/YYYY h:mm A");

Tôi đã chọn định dạng này theo nhu cầu của tôi. Bạn có thể thay đổi định dạng theo yêu cầu của bạn.


2
        //get start of week; QT
    function _getStartOfWeek (date){
        var iDayOfWeek = date.getDay();
        var iDifference = date.getDate() - iDayOfWeek + (iDayOfWeek === 0 ?  -6:1);

        return new Date(date.setDate(iDifference));
    }, 

    function _getEndOfWeek(date){
        return new Date(date.setDate(date.getDate() + (7 - date.getDay()) === 7 ? 0 : (7 - date.getDay()) ));
    }, 

* ngày hiện tại == 30.06.2016 và thứ hai là ngày đầu tiên trong tuần.

Nó cũng hoạt động trong nhiều tháng và năm khác nhau. Đã thử nghiệm với bộ qunit:

nhập mô tả hình ảnh ở đây

        QUnit.module("Planung: Start of week");
    QUnit.test("Should return start of week based on current date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date());
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a sunday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-07-03"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.test("Should return start of week based on a monday date", function (assert) {
        var startOfWeek = Planung._getStartOfWeek(new Date("2016-06-27"));
        assert.ok( startOfWeek , "returned date: "+ startOfWeek);
    });

    QUnit.module("Planung: End of week");
    QUnit.test("Should return end of week based on current date", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date());
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on sunday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-07-03"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on monday date with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-27"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 21-06-2016 with different month", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-06-21"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 28-12-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-12-28"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });
    QUnit.test("Should return end of week based on 01-01-2016 with different month and year", function (assert) {
        var endOfWeek = Planung._getEndOfWeek(new Date("2016-01-01"));
        assert.ok( endOfWeek , "returned date: "+ endOfWeek);
    });

2
var dt = new Date()  //current date of week
var currentWeekDay = dt.getDay();
var lessDays = currentWeekDay == 0 ? 6 : currentWeekDay-1
var wkStart = new Date(new Date(dt).setDate(dt.getDate()- lessDays));
var wkEnd = new Date(new Date(wkStart).setDate(wkStart.getDate()+6));

Điều này sẽ hữu ích cho bất kỳ tình huống ngày nào.


1

phương pháp của krtek có một số sai, tôi đã thử nghiệm điều này

var startDay = 0; 
var weekStart = new Date(today.getDate() - (7 + today.getDay() - startDay) % 7);
var weekEnd = new Date(today.getDate() + (6 - today.getDay() - startDay) % 7);

nó hoạt động


1

Mặc dù câu hỏi có vẻ lỗi thời nhưng tôi phải chỉ ra một vấn đề.
Câu hỏi: Điều gì sẽ xảy ra vào ngày 1 tháng 1 năm 2016?
Tôi nghĩ rằng hầu hết các giải pháp trên đều tính toán đầu tuần là ngày 27.12.2016. Vì lý do này, tôi nghĩ rằng, phép tính chính xác sẽ đơn giản như sau;

var d = new Date(),
    dayInMs = 1000 * 60 * 60 * 24,
    weekInMs = dayInMs * 7,
    startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()).valueOf(),
    todayElapsedTime = d.valueOf() - startOfToday,
    dayDiff = d.getDay() * dayInMs,
    dateDiff = dayDiff + todayElapsedTime, 
    // finally
    startOfWeek = d.valueOf() - dateDiff,
    endOfWeek = startOfWeek + weekInMs - 1;

0

Đề xuất tốt nhưng bạn có một vấn đề nhỏ trong ngày hôm qua. Bạn nên thay đổi nó thành:

lastday = new Date(firstday.getTime() + 60 * 60 *24 * 6 * 1000);

Không phải tất cả các ngày đều dài 24 giờ khi tiết kiệm ánh sáng ban ngày được quan sát.
RobG

0

Phương pháp tiếp cận thời điểm phù hợp với tôi cho tất cả các trường hợp (mặc dù tôi chưa kiểm tra các ranh giới như cuối năm, năm nhuận). Chỉ Sửa trong đoạn mã trên là tham số là "isoWeek", nếu bạn muốn bắt đầu tuần từ thứ Hai.

    let startOfWeek = moment().startOf("isoWeek").toDate();
    let endOfWeek = moment().endOf("isoWeek").toDate();

0

Chỉ cần sử dụng javascript thuần túy, bạn có thể sử dụng chức năng bên dưới để nhận ngày đầu tiên và ngày cuối cùng của tuần với tùy chọn thiết lập ngày đầu tuần.

var weekday = [];
weekday[0] = "Sunday";
weekday[1] = "Monday";
weekday[2] = "Tuesday";
weekday[3] = "Wednesday";
weekday[4] = "Thursday";
weekday[5] = "Friday";
weekday[6] = "Saturday";

function getFirstDayOfWeek(date, from) {
    //Default start week from 'Sunday'. You can change it yourself.
    from = from || 'Sunday'; 
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 7 : start);
    d.setDate(diff);
    return d;
};

Ngày cuối cùng của tuần chỉ 6 ngày sau ngày đầu tiên của tuần

function getLastDayOfWeek(date, from) {
    from = from || 'Sunday';
    var index = weekday.indexOf(from);
    var start = index >= 0 ? index : 0;

    var d = new Date(date);
    var day = d.getDay();
    var diff = d.getDate() - day + (start > day ? start - 1 : 6 + start);
    d.setDate(diff);
    return d;
};

Kiểm tra:

getFirstDayOfWeek('2017-10-16'); //--> Sun Oct 15 2017
getFirstDayOfWeek('2017-10-16', 'Monday'); //--> Mon Oct 16 2017
getFirstDayOfWeek('2017-10-16', 'Tuesday'); //--> Tue Oct 10 2017

0

JavaScript

function getWeekDays(curr, firstDay = 1 /* 0=Sun, 1=Mon, ... */) {
  var cd = curr.getDate() - curr.getDay();
  var from = new Date(curr.setDate(cd + firstDay));
  var to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

TypeScript

export enum WEEK_DAYS {
  Sunday = 0,
  Monday = 1,
  Tuesday = 2,
  Wednesday = 3,
  Thursday = 4,
  Friday = 5,
  Saturday = 6,
}

export const getWeekDays = (
  curr: Date,
  firstDay: WEEK_DAYS = WEEK_DAYS.Monday
): { from: Date; to: Date } => {
  const cd = curr.getDate() - curr.getDay();
  const from = new Date(curr.setDate(cd + firstDay));
  const to = new Date(curr.setDate(cd + 6 + firstDay));

  return {
    from,
    to,
  };
};

0

Chúng tôi đã thêm mã jquery hiển thị tuần hiện tại trong các ngày từ thứ hai đến chủ nhật.

var d = new Date();
var week = [];
var _days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
var _months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
for (let i = 1; i <= 7; i++) {
    let first = d.getDate() - d.getDay() + i; 
    let dt = new Date(d.setDate(first));
    var _day = _days[dt.getDay()];
     var _month = _months[dt.getMonth()];
     var _date = dt.getDate();
     if(_date < 10 ){
         _date = '0' +_date;
     }
     var _year = dt.getFullYear();
     var fulldate = _day+' '+_month+' '+_date+' '+_year+' ';
     week.push(fulldate);
  }
console.log(week);

Mã này lưu trữ các ngày trong tuần trong một mảng có tên là tuần. Định dạng ngày được lưu trữ trong mảng là Ngày Thứ Hai Ngày Năm có nghĩa là nó hiển thị ngày đầu tiên của tuần, sau đó là tháng, ngày và năm.
Neeraj Singh

"Mã jQuery" này như thế nào? Có rất nhiều câu trả lời đơn giản hơn bằng cách sử dụng cùng một kỹ thuật.
RobG

0

Một câu hỏi cũ với nhiều câu trả lời, vì vậy một câu trả lời khác sẽ không thành vấn đề. Một số chức năng chung để lấy đầu và cuối của tất cả các loại đơn vị thời gian.

Đối với startOfendOf week, ngày bắt đầu của tuần được mặc định là Chủ nhật (0) nhưng bất kỳ ngày nào cũng có thể trôi qua (Thứ Hai - 1, Thứ Ba - 2, v.v.). Tuy nhiên, chỉ sử dụng lịch Gregorian.

Các hàm không thay đổi ngày nguồn, vì vậy, để xem liệu một ngày có trong cùng một tuần với một số ngày khác (tuần bắt đầu vào thứ Hai) hay không:

if (d >= startOf('week', d1, 1) && d <= endOf('week', d1, 1)) {
  // d is in same week as d1
}

hoặc trong tuần hiện tại bắt đầu vào Chủ nhật:

if (d >= startOf('week') && d <= endOf('week')) {
  // d is in the current week
}

// Returns a new Date object set to start of given unit
// For start of week, accepts any day as start
function startOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(d);
  e.setHours(23,59,59,999);
  // Define methods
  let start = {
    second: d => d.setMilliseconds(0),
    minute: d => d.setSeconds(0,0),
    hour  : d => d.setMinutes(0,0,0),
    day   : d => d.setHours(0,0,0,0),
    week  : d => {
      start.day(d);
      d.setDate(d.getDate() - d.getDay() + weekStartDay);
      if (d > e) d.setDate(d.getDate() - 7);
    },
    month : d => {
      start.day(d);
      d.setDate(1);
    },
    year  : d => {
      start.day(d);
      d.setMonth(0, 1);
    },
    decade: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 10);
    },
    century: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 100);
    },
    millenium: d => {
      start.year(d);
      let year = d.getFullYear();
      d.setFullYear(year - year % 1000);
    }
  }
  start[unit](d);
  return d;
}

// Returns a new Date object set to end of given unit
// For end of week, accepts any day as start day
// Requires startOf
function endOf(unit, date = new Date(), weekStartDay = 0) {
  // Copy original so don't modify it
  let d = new Date(date);
  let e = new Date(date);
  e.setHours(23,59,59,999);
  // Define methods
  let end = {
    second: d => d.setMilliseconds(999),
    minute: d => d.setSeconds(59,999),
    hour  : d => d.setMinutes(59,59,999),
    day   : d => d.setHours(23,59,59,999),
    week  : w => {
      w = startOf('week', w, weekStartDay);
      w.setDate(w.getDate() + 6);
      end.day(w);
      d = w;
    },
    month : d => {
      d.setMonth(d.getMonth() + 1, 0);
      end.day(d);
    },  
    year  : d => {
      d.setMonth(11, 31);
      end.day(d);
    },
    decade: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 10 + 9);
    },
    century: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 100 + 99);
    },
    millenium: d => {
      end.year(d);
      let y = d.getFullYear();
      d.setFullYear(y - y % 1000 + 999);
    }
  }
  end[unit](d);
  return d;
}

// Examples
let d = new Date();

['second','minute','hour','day','week','month','year',
 'decade','century','millenium'].forEach(unit => {
   console.log(('Start of ' + unit).padEnd(18)  + ': ' +
   startOf(unit, d).toString());
   console.log(('End of ' + unit).padEnd(18)  + ': ' +
   endOf(unit, d).toString());
});


0

Thay đổi nhỏ đối với câu trả lời @Chris Lang. nếu bạn muốn thứ Hai là ngày đầu tiên sử dụng điều này.

Date.prototype.GetFirstDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay()+ (this.getDay() == 0 ? -6:1) )));
}
Date.prototype.GetLastDayOfWeek = function() {
    return (new Date(this.setDate(this.getDate() - this.getDay() +7)));
}

var today = new Date();

alert(today.GetFirstDayOfWeek());

alert(today.GetLastDayOfWeek());

Thaks @Chris Lang

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.