JavaScript에서 마지막 달 계산


277

당신이 제공하는 경우 0dayValue에서 Date.setFullYear당신은 이전 달의 마지막 날을 얻을 :

d = new Date(); d.setFullYear(2008, 11, 0); //  Sun Nov 30 2008

mozilla 에서이 동작에 대한 참조가 있습니다 . 이것이 신뢰할 수있는 브라우저 간 기능입니까, 아니면 다른 방법을 살펴 봐야합니까?


지정된 달의 마지막 날을 의미하지 않습니까? 11 월 30 일과 10 월 31 일이 있습니다.
Chris Serra

16
자바 스크립트에서는 월이 0부터 시작하므로 11 월은 12 월
Greg

2
@TheCloudlessSky-콘솔에서 사용해보십시오 ... (2008,11,0)는 12 월의 0 번째 날이므로 11 월 마지막 날
Ken

@Ken-예-나는 "0"이 있다는 것을 몰랐다 :) ... 아침이 너무 빨랐다.
TheCloudlessSky

답변:


424
var month = 0; // January
var d = new Date(2008, month + 1, 0);
alert(d); // last day in January

IE 6:                     Thu Jan 31 00:00:00 CST 2008
IE 7:                     Thu Jan 31 00:00:00 CST 2008
IE 8: Beta 2:             Thu Jan 31 00:00:00 CST 2008
Opera 8.54:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.27:               Thu, 31 Jan 2008 00:00:00 GMT-0600
Opera 9.60:               Thu Jan 31 2008 00:00:00 GMT-0600
Firefox 2.0.0.17:         Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Firefox 3.0.3:            Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Google Chrome 0.2.149.30: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)
Safari for Windows 3.1.2: Thu Jan 31 2008 00:00:00 GMT-0600 (Canada Central Standard Time)

출력 차이는 toString()날짜가 다르기 때문에 구현의 차이로 인한 것이 아닙니다.

물론, 위에서 식별 한 브라우저가 지난 달의 마지막 날로 0을 사용한다고해서 계속 그렇게하거나 또는 나열되지 않은 브라우저가 그렇게한다는 것을 의미하지는 않지만, 브라우저가 작동해야한다는 신념에 대한 신뢰를 제공합니다. 모든 브라우저에서 동일한 방식으로.


19
그것은 완벽하게 잘 작동하는 것 같습니다. 호기심으로이 모든 엔진에서 자바 스크립트를 실행하기 위해 무엇을 사용하고 있습니까? 모든 것이 준비되었거나 도구가 있습니까?
neonski

5
d.getDate ()를 사용하여 실제 날짜를 얻을 수 있습니다.
rynop

35
"브라우저가… 지난 달의 마지막 날로 0을 사용한다고해서 계속 그렇게한다는 의미는 아닙니다." 그렇습니다. ECMA-262에서 요구합니다.
RobG


4
Chrome 48.0.2564.116에서는 작동하지 않습니다. 아마도이 방법은 '표준'이 아닌 것 같습니다.
xarlymg89

77

다음 달의 첫날에 중간 날짜를 사용하고 전날의 날짜를 반환합니다.

int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);

ECMAScript 사양 에 따르면 , 지적한대로 "날짜"생성자를 사용하는 것이 유효합니다. "MakeDay"함수로 지정된 알고리즘에 따라 문제를 잘 처리해야합니다.
Pablo Cabrera

1
이것이 최고의 솔루션 IMO입니다. 허용 된 답변을 시도했지만 현재 달의 마지막을 가져올 때 약간의 버그가 있습니다. 오늘 날짜를 반환합니다. 그래도 왜 그런지 모르겠습니다.
Gogol

1
버그를 재현 할 수 없습니다. 모든 브라우저에서 정확한 날짜를 알려줍니다.today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
orad

이렇게하면 시간이 마지막 밀리 초 (예 : 23 : 59 : 59.999)로 설정된 달의 마지막 날에 대한 Date 객체가 생성됩니다. OP에서 메소드를 사용하고 추가 단계 및 날짜 오브젝트를 저장하는 것이 좋습니다.
RobG

@RobG : 동의합니다! 내 달의 마지막 날에 0을 사용한다는 개념은 내 의견으로는 약간 혼란 스럽기 때문에 내 솔루션을 이해하기가 더 쉬울 수 있습니다.
karlipoppins

72

나는 이것이 최선의 해결책이라고 생각한다. Date 객체가 계산하도록합니다.

var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);

day 매개 변수를 0으로 설정하면 전월의 마지막 날인 월의 첫 날보다 하루가 적습니다.


1
괜찮습니다. 선택한 답변이 동일하게 제안하는 것을 알았습니다. 이것은 가장 빠르고 가장 안정적인 방법이며 캘린더 유형에 관계없이 작동합니다. 예를 들어 Date가 Gregorian 달력 이외의 것을 구현 한 경우에도 여전히 작동합니다. 그레고리력이 아닌 Date 객체 구현 예는 intldate.codeplex.com 을 참조하십시오 .
orad

1
@orad : 이 방법이 실제로 일부 대안보다 상당히 느리기 때문에 "가장 빠르다" 고 주장하는 것에주의하십시오 . 사용은 new Date이다 그래서 훨씬 느리다는 심지어 반환 한 차트에 표시되지 않습니다 : jsperf.com/days-in-month-perf-test/6
코딩 사라

@TrueBlueAussie OK. 나는 그것이 네이티브이기 때문에 더 빠르다고 가정했습니다. 그러나 당신이 옳습니다. 빠르지는 않습니다. 실제로 테스트 해 주셔서 감사합니다. 어쨌든,이 솔루션은 간결하고 읽기 쉽고 다른 모든 솔루션과 달리 그레고리오 력에 속하지 않기 때문에 나에게 가장 효과적입니다.
orad

"다른 모든 솔루션과 달리 그레고리력에는 제한이 없습니다"!!! 이 알고리즘은 1-4000 년 동안 광산과 동일한 값을 반환합니다. jsfiddle.net/2973x9m3/3 이 기능이 지원한다고 주장하는 추가 날짜 범위는 무엇입니까? :)
사라지다

1
기본 JS 날짜는 그레고리력 만 사용합니다. 그러나 다른 캘린더 유형을 얻기 위해 다른 구현으로 모의 할 수 있습니다. 예를 들어 IntlDate 를 참조하십시오 . Date 객체를 사용하여 월별보기를 만드는 날짜 선택기가있는 경우 인터페이스가 동일한 경우 사용중인 Date 구현 (네이티브 또는 모의)이 중요하지 않습니다. 따라서 공유 인터페이스를 사용하면 각 캘린더에서 한 달에 몇 일이 있는지 알 필요없이 다른 캘린더 유형간에 전환 할 수 있습니다.
orad

25

컴퓨터 용어 new Date()regular expression솔루션은 느립니다! 당신은 초고속 (슈퍼 비밀) 한 줄을 원하는 경우, (가정이 하나의 시도 mJan=1형식). 최상의 성능을 얻으려면 다른 코드 변경을 계속 시도하십시오.

내 현재 가장 빠른 버전 :

이 관련 질문 비트 비트 연산자 (놀라운 속도)를 사용하여 윤년 검사를 확인 하고 25 및 15 매직 숫자가 무엇을 나타내는 지 발견 한 후이 최적화 된 답변 하이브리드를 생각해 냈습니다.

function getDaysInMonth(m, y) {
    return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}

비트 시프 팅이 주어지면 문자열로 숫자를 전달하면 이상한 결과가 발생하므로 m& y매개 변수가 모두 정수 라고 가정합니다 .

JSFiddle : http://jsfiddle.net/TrueBlueAussie/H89X3/22/

JSPerf 결과 : http://jsperf.com/days-in-month-head-to-head/5

몇 가지 이유, (m+(m>>3)&1) 보다 효율적입니다 (5546>>m&1)거의 모든 브라우저.

속도에 대한 유일한 실제 경쟁은 @GitaarLab과의 경쟁이므로 테스트 할 http://jsperf.com/days-in-month-head-to-head/5 를 위해 헤드 투 헤드 JSPerf를 만들었습니다.


그것은 내 윤년 해답을 기반으로 작동합니다 : 여기에서 윤년을 찾는 자바 스크립트 여기에서 이진 논리뿐만 아니라 비트 단위 연산자 (놀라운 속도)사용하여 윤년 검사 .

이진 달에 대한 빠른 교훈 :

원하는 월의 인덱스 (Jan = 1) 를 이진수로 해석하면 31 일의 월에 비트 3이 지워지고 비트 0이 설정되거나 비트 3이 설정되고 비트 0이 지워지는 것을 알 수 있습니다.

Jan = 1  = 0001 : 31 days
Feb = 2  = 0010
Mar = 3  = 0011 : 31 days
Apr = 4  = 0100
May = 5  = 0101 : 31 days
Jun = 6  = 0110
Jul = 7  = 0111 : 31 days
Aug = 8  = 1000 : 31 days
Sep = 9  = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days

즉, 사용자는 값을 3 개 위치 이동할 수 >> 3일본어와 XOR 비트를 ^ m상기 결과가 있는지 1또는 0 비트 위치 0에 사용 & 1. 참고 : +XOR ( ^) 보다 약간 빠르며 (m >> 3) + m비트 0에서 동일한 결과를 제공합니다.

JSPerf 결과 : http://jsperf.com/days-in-month-perf-test/6


원래 알고리즘 및 전체 히스토리 (댓글 참조) : stackoverflow.com/questions/1810984/ 일수-개월 /… 다음에 stackoverflow.com/questions/1810984/ 일수
-month

1
@ GitaarLAB : 당신은 이미 언급 한 것을 가지고 있으며 이것은 당신이 잘 알고있는 것과 당신의 것과 정확히 같지 않았습니다. 서로의 알고리즘의 증분 업데이트는 "원래 알고리즘"과 동일하지 않습니다. P : 저도이 답변에 많은 노력을 넣어
사라 코딩

@TrueBlueAussie가 : 걱정이나이 우리의 편집 - 역사를 볼 수있는 또 다른 이동을하고자하는 사람이 볼 수 있도록 우리가했을 때 나는 단지 더 많은 정보 우리의 보물 지점으로 미래의 리더를 원했다 (I는 모두 우리의 대답을 연결 무엇을 하고 ). 나는 우리의 하루 종일 경쟁을 아직도 좋아합니다! :)내가 게시 한 첫 번째 답변 버전은 실제로 불필요한 괄호 세트를 가지고 있었으므로 제거되었습니다 (내가 당신을 인정한 것). 그래서 우리는 캐릭터를 면도하고 이것으로 끝날 수 있습니다. 나는 여전히 그 즐거운 하루 감사합니다, 건배!
GitaarLAB

1
그 언급 해주십시오 ym변수는 문자열이 아닌 정수 해! 예를 들어 2 월의 경우 30을 반환하는 잘못된 계산이 발생합니다. parseInt()작동 하려면 함수를 사용해야 했습니다.
대신


16

lebreeze가 제공하는 솔루션을 약간 수정했습니다 .

function daysInMonth(iMonth, iYear)
{
    return new Date(iYear, iMonth, 0).getDate();
}

return new Date(iYear, 1 + iMonth, 0).getDate();@lebreeze의 솔루션과 동일 해야합니다 .
무스

6

나는 최근에 비슷한 것을해야했다. 이것은 내가 생각해 낸 것이다.

/**
* Returns a date set to the begining of the month
* 
* @param {Date} myDate 
* @returns {Date}
*/
function beginningOfMonth(myDate){    
  let date = new Date(myDate);
  date.setDate(1)
  date.setHours(0);
  date.setMinutes(0);
  date.setSeconds(0);   
  return date;     
}

/**
 * Returns a date set to the end of the month
 * 
 * @param {Date} myDate 
 * @returns {Date}
 */
function endOfMonth(myDate){
  let date = new Date(myDate);
  date.setMonth(date.getMonth() +1)
  date.setDate(0);
  date.setHours(23);
  date.setMinutes(59);
  date.setSeconds(59);
  return date;
}

날짜를 전달하면 월의 시작 또는 월의 끝으로 설정된 날짜가 반환됩니다.

begninngOfMonth기능은 상당히 자명하지만 endOfMonth기능에 들어가는 것은 월을 다음 달로 증가시킨 다음 setDate(0)이전 달의 마지막 날로 롤백 하는 데 사용 하는 것입니다. setDate 사양 :

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate https://www.w3schools.com/jsref/jsref_setdate.asp

그런 다음 시간 / 분 / 초를 하루의 끝으로 설정하여 날짜 범위를 예상하는 API를 사용하는 경우 마지막 날 전체를 캡처 할 수 있습니다. 그 부분은 원래 게시물이 요구하는 것을 넘어서지 만 다른 사람이 비슷한 솔루션을 찾는 데 도움이 될 수 있습니다.

편집 : 당신은 또한 setMilliseconds()여분의 정확성을 원한다면 여분의 마일을 가고 밀리 초를 설정할 수 있습니다.


4

이거 한번 해봐.

lastDateofTheMonth = new Date(year, month, 0)

예:

new Date(2012, 8, 0)

산출:

Date {Fri Aug 31 2012 00:00:00 GMT+0900 (Tokyo Standard Time)}

5
그러나 월은 0부터 시작하므로 월이 실제로 8 월이 아닌 9 월이므로 "8"을 전달합니다.
Steve J

3

이것은 나를 위해 작동합니다. 주어진 연도 및 월의 마지막 날을 제공합니다.

var d = new Date(2012,02,0);
var n = d.getDate();
alert(n);

1
"2"앞에있는 0에주의하십시오. 8 진수로 해석됩니다.
Walfrat

1

이것은 잘 작동합니다 :

Date.prototype.setToLastDateInMonth = function () {

    this.setDate(1);
    this.setMonth(this.getMonth() + 1);
    this.setDate(this.getDate() - 1);

    return this;
}

1

이것은 당신에게 현재 달 첫날과 마지막 날을 줄 것입니다.

'연도'를 변경해야하는 경우 d.getFullYear ()를 제거하고 연도를 설정하십시오.

'month'를 변경해야하는 경우 d.getMonth ()를 제거하고 연도를 설정하십시오.

var d = new Date();
var days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var fistDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth(), 1).getDay())];
	var LastDayOfMonth = days[(new Date(d.getFullYear(), d.getMonth() + 1, 0).getDay())]; 
console.log("First Day :" + fistDayOfMonth); 
console.log("Last Day:" + LastDayOfMonth);
alert("First Day :" + fistDayOfMonth); 
alert("Last Day:" + LastDayOfMonth);


1

이 시도:

function _getEndOfMonth(time_stamp) {
    let time = new Date(time_stamp * 1000);
    let month = time.getMonth() + 1;
    let year = time.getFullYear();
    let day = time.getDate();
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            day = 31;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            day = 30;
            break;
        case 2:
            if (_leapyear(year))
                day = 29;
            else
                day = 28;
            break
    }
    let m = moment(`${year}-${month}-${day}`, 'YYYY-MM-DD')
    return m.unix() + constants.DAY - 1;
}

function _leapyear(year) {
    return (year % 100 === 0) ? (year % 400 === 0) : (year % 4 === 0);
}

1

아래 함수는 매월 마지막 날입니다.

function getLstDayOfMonFnc(date) {
  return new Date(date.getFullYear(), date.getMonth(), 0).getDate()
}

console.log(getLstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 29
console.log(getLstDayOfMonFnc(new Date(2017, 2, 15))) // Output : 28
console.log(getLstDayOfMonFnc(new Date(2017, 11, 15))) // Output : 30
console.log(getLstDayOfMonFnc(new Date(2017, 12, 15))) // Output : 31

마찬가지로 우리는 달의 첫날을 얻을 수 있습니다 :

function getFstDayOfMonFnc(date) {
  return new Date(date.getFullYear(), date.getMonth(), 1).getDate()
}

console.log(getFstDayOfMonFnc(new Date(2016, 2, 15))) // Output : 1


0
function getLastDay(y, m) {
   return 30 + (m <= 7 ? ((m % 2) ? 1 : 0) : (!(m % 2) ? 1 : 0)) - (m == 2) - (m == 2 && y % 4 != 0 || !(y % 100 == 0 && y % 400 == 0)); 
}

0
const today = new Date();

let beginDate = new Date();

let endDate = new Date();

// fist date of montg

beginDate = new Date(

  `${today.getFullYear()}-${today.getMonth() + 1}-01 00:00:00`

);

// end date of month 

// set next Month first Date

endDate = new Date(

  `${today.getFullYear()}-${today.getMonth() + 2}-01 :23:59:59`

);

// deducting 1 day

endDate.setDate(0);

0

월 설정 날짜를 정한 다음 날을 0으로 설정하십시오. 월은 날짜 함수에서 1-31로 시작한 다음 마지막 날을 얻습니다 ^

var last = new Date(new Date(new Date().setMonth(7)).setDate(0)).getDate();
console.log(last);


0

다음은 GMT와 초기 날짜의 시간을 절약하는 답변입니다.

var date = new Date();

var first_date = new Date(date); //Make a copy of the date we want the first and last days from
first_date.setUTCDate(1); //Set the day as the first of the month

var last_date = new Date(first_date); //Make a copy of the calculated first day
last_date.setUTCMonth(last_date.getUTCMonth() + 1); //Add a month
last_date.setUTCDate(0); //Set the date to 0, this goes to the last day of the previous month

console.log(first_date.toJSON().substring(0, 10), last_date.toJSON().substring(0, 10)); //Log the dates with the format yyyy-mm-dd


0

나는 그것이 의미의 문제 일 뿐이라는 것을 알고 있지만 결국이 형식으로 사용했습니다.

var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate();
console.log(lastDay);

함수는 내부 인수에서 외부로 해결되므로 동일하게 작동합니다.

그런 다음 현재 날짜에서 시작했는지 여부에 관계없이 연도 및 월 / 년을 필요한 세부 정보로 바꿀 수 있습니다. 또는 특정 월 / 년.


0

월말이 정확히 밀리 초 단위 (예 : 타임 스탬프)가 필요한 경우 :

d = new Date()
console.log(d.toString())
d.setDate(1)
d.setHours(23, 59, 59, 999)
d.setMonth(d.getMonth() + 1)
d.setDate(d.getDate() - 1)
console.log(d.toString())

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