[javascript] JavaScript에서 마지막 달 계산

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

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

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



답변

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을 사용한다고해서 계속 그렇게하거나 또는 나열되지 않은 브라우저가 그렇게한다는 것을 의미하지는 않지만, 브라우저가 작동해야한다는 신념에 대한 신뢰를 제공합니다. 모든 브라우저에서 동일한 방식으로.


답변

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

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


답변

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

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

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


답변

컴퓨터 용어 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


답변

내 동료가 다음을 우연히 발견했습니다.

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

http://snippets.dzone.com/posts/show/2099에서 도난


답변

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

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


답변

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

/**
* 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()여분의 정확성을 원한다면 여분의 마일을 가고 밀리 초를 설정할 수 있습니다.