JavaScript에서 요일과 마지막 요일을 얻는 방법


94

나는 today = new Date();물건이있다. 이번주의 첫날과 마지막 날을 가져와야합니다. 일주일의 시작일과 종료일로 일요일과 월요일에 대한 두 가지 변형이 모두 필요합니다. 이제 코드와 약간 혼동합니다. 당신이 나를 도울 수 있습니까?

답변:


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"

이것은 첫날 = 이번 주 일요일, 마지막 날 = 이번 주 토요일에 적용됩니다. 월요일에서 일요일까지 실행하도록 확장하는 것은 간단합니다.

다른 달의 첫날과 마지막 날에 작동하도록 만드는 것은 사용자를위한 연습으로 남겨집니다.


고마워요, 어떻게 만들 수 있지만 첫날이 월요일이면?
JuanPablo

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

40
다른 달이있을 때 작동하게하려면var lastday = new Date(curr.setDate(first.getDate()+6)).toUTCString();
Richard N

2
@Rayons 답변과 유사한 코드이지만 다른 몇 달 및 몇 년 동안도 작동 할 것입니다 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(); . 약간의 실수가있는 @RichardN의 코드를 수정했습니다
Azeez

60
"사용자를위한 연습"… 정말?
adius

62

허용되는 답변에주의하십시오. 시간이 00:00:00 및 23:59:59로 설정되지 않으므로 문제가 발생할 수 있습니다.

Moment.js를 사용하여 날짜를 처리하는 것이 좋습니다. 귀하의 경우 :

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

이것은 작은 사용 사례 일 뿐이며 많은 복잡한 작업을 수행하는 것은 정말 간단합니다.

자세한 내용은 http://momentjs.com/ 에서 확인할 수 있습니다 .


19
moment를 사용하면 "week"대신 "isoweek"를 사용합니다. 그렇지 않으면 주가 일요일부터 시작되고 토요일로 끝납니다. 그래서 var startOfWeek = moment().startOf('isoweek').toDate(); var endOfWeek = moment().endOf('isoweek').toDate();
Brugolo dec

감사 너희들은 내 시간 :-) 저장
에드 Ehtsham 압바스

1
moment.js를 사용하지 않고 시간을 계산하려면 Date.setHours를 사용합니다. curr.setHours (0,0,0,0); lastday.setHours (23,59,59,59);
matadur

'isoWeek'하지 'isoweek'이어야합니다
Mayur 온건

Love moment js, 최고의 날짜 / 시간 라이브러리 중 하나!
Vippy

50

다음 코드 줄을 사용하여주의 첫 번째 및 마지막 날짜를 가져올 수도 있습니다.

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

도움이 되길 바랍니다 ..


2
예,하지만 @totymedii, Raynos 답변이 2019 년 3 월 1 일에 잘못되었습니다. 증거가 있습니다. 첫날 :: Sun, 2019 년 2 월 24 일 08:33:48 GMT 마지막 날 :: Sat, 02 Feb 2019 08:33:48 GMT
Deepak Patel

14

시작일에 대해 첫날과 마지막 날을 빠르게 확인할 수있는 방법이 있습니다. 그것을 아는 것은:

1 일 = 86,400,000 밀리 초.

JS 날짜 값은 밀리 초 단위입니다.

레시피 : 한주의 시작일을 얻기 위해 제거해야하는 일 수를 파악합니다 (1 일 분량의 밀리 초 곱하기). 그 후 남은 것은 종료일을 얻기 위해 6 일을 추가하는 것입니다.

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
일 DST 긴 덕분에 항상 86,400,000 밀리 초 때문 ... 작동하지 않습니다
ValarDohaeris

9

우수한 (불변) date-fns 라이브러리 는이를 가장 간결하게 처리합니다.

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

기본 시작 요일은 일요일 (0)이지만 다음과 같이 월요일 (1)로 변경할 수 있습니다.

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

1
플러스 1 일-FNS가 아닌 현재 사용
CENT1PEDE

@RobG 사용하는 모든 방법에는 기본 요일이 있습니다.
Freewalker

4

이런 식으로 할 수 있습니다.

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

어디 startDay0에서 6까지의 숫자이고 0은 일요일 스탠드 (등 즉, 1 = 월요일 2 = 화요일).


3

SetDate날짜를 설정합니다. setDate월의 시작과 끝에 사용하면 잘못된 주가됩니다.

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

날짜를 2014 년 7 월 1 일로 설정하면 2014 년 7 월 5 일 대신 첫날은 2014 년 6 월 29 일로, 마지막 날은 2014 년 6 월 5 일로 표시됩니다.

그래서 내가 사용한이 문제를 극복하십시오.

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

" 월의 시작과 말에 setDate를 사용하면 올바르게 사용하지 않으면 잘못된 주가 됩니다."
RobG

3

이것은 연도 및 월 변경에 적용됩니다.

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

이제 중복되는 것 같습니다. smh
Chris Lang

그리고 몇 주 동안 월요일에 시작합니까?
RobG

@RobG 이것을
SHIVA

2

이러한 경우에는 Moment.js를 사용하는 것이 좋습니다. 현재 날짜 시간, 이번 주, 이번 달 및 이번 분기 날짜 시간을 확인해야하는 시나리오가있었습니다. 위의 답변이 도움이되었으므로 나머지 기능도 공유하려고 생각했습니다.

특정 형식으로 현재 날짜 시간을 가져 오려면

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

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

주는 일요일부터 시작하여 토요일에 끝납니다. endOf 함수의 매개 변수로 단순히 'week'를 사용하지만 일요일을 주말로 가져 오려면 '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");

필요에 따라이 형식을 선택했습니다. 요구 사항에 따라 형식을 변경할 수 있습니다.


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

* 현재 날짜 == 30.06.2016 및 월요일은주의 첫 번째 날입니다.

또한 다른 달과 년 동안 작동합니다. qunit 제품군으로 테스트되었습니다.

여기에 이미지 설명 입력

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

이것은 모든 날짜 시나리오에 유용합니다.


1

krtek의 방법에 약간의 오류가 있습니다.

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

효과가있다


1

질문이 쓸모없는 것처럼 보이지만 문제를 지적해야합니다.
질문 : 2016 년 1 월 1 일에는 어떻게 되나요?
위의 솔루션 대부분은 주 시작을 27.12.2016으로 계산한다고 생각합니다. 이런 이유로 정확한 계산은 다음과 같이 간단해야한다고 생각합니다.

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

좋은 제안이지만 어제 작은 문제가 생겼습니다. 다음과 같이 변경해야합니다.

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

일광 절약이 적용되는 모든 날이 24 시간 인 것은 아닙니다.
RobG

0

순간 접근 방식은 모든 경우에 효과적이었습니다 (연말, 윤년과 같은 경계를 테스트하지는 않았지만). 월요일부터 시작하려는 경우 위 코드의 수정 만 매개 변수가 "isoWeek"입니다.

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

0

순수한 자바 스크립트를 사용하기 만하면 아래 기능을 사용하여 주 시작 요일을 자유롭게 설정하여주의 첫날과 마지막 날을 얻을 수 있습니다.

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

마지막 요일은 첫 번째 요일 이후 6 일입니다.

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

테스트:

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

자바 스크립트

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

월요일부터 일요일까지 현재 요일을 표시하는 jquery 코드를 추가했습니다.

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

이 코드는 week라는 배열에 요일을 저장합니다. 배열에 저장되는 날짜 형식은 Day Mon Date Year라는 의미는 첫 번째 요일을 표시 한 다음 월, 날짜 및 연도를 나타냅니다.
Neeraj Singh

이 "jQuery 코드"는 어떻습니까? 동일한 기술을 사용하는 더 간단한 답변이 많이 있습니다.
RobG

0

답변이 많은 오래된 질문이므로 다른 질문은 문제가되지 않습니다. 모든 종류의 시간 단위의 시작과 끝을 가져 오는 몇 가지 일반 함수입니다.

대한 startOf! 로베르토 주 일요일 (0)하지만, 모든 일에 주 기본값의 시작 날 (- 1, 화요일 - 2 등 월) 전달 될 수 있습니다. 그래도 그레고리력 만 사용합니다.

이 함수는 소스 날짜를 변경하지 않으므로 날짜가 다른 날짜 (월요일에 시작하는 주)와 같은 주에 있는지 확인합니다.

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

또는 일요일에 시작하는 이번 주 :

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

@Chris Lang 대답에 대한 작은 변경. 월요일을 첫날로 원한다면 이것을 사용하십시오.

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

탁스 @ 크리스 랭

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.