당신이 제공하는 경우 0
로 dayValue
에서 Date.setFullYear
당신은 이전 달의 마지막 날을 얻을 :
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
mozilla 에서이 동작에 대한 참조가 있습니다 . 이것이 신뢰할 수있는 브라우저 간 기능입니까, 아니면 다른 방법을 살펴 봐야합니까?
당신이 제공하는 경우 0
로 dayValue
에서 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);
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
나는 이것이 최선의 해결책이라고 생각한다. Date 객체가 계산하도록합니다.
var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);
day 매개 변수를 0으로 설정하면 전월의 마지막 날인 월의 첫 날보다 하루가 적습니다.
new Date
이다 그래서 훨씬 느리다는 심지어 반환 한 차트에 표시되지 않습니다 : jsperf.com/days-in-month-perf-test/6
컴퓨터 용어 new Date()
와 regular expression
솔루션은 느립니다! 당신은 초고속 (슈퍼 비밀) 한 줄을 원하는 경우, (가정이 하나의 시도 m
에 Jan=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
:)
내가 게시 한 첫 번째 답변 버전은 실제로 불필요한 괄호 세트를 가지고 있었으므로 제거되었습니다 (내가 당신을 인정한 것). 그래서 우리는 캐릭터를 면도하고 이것으로 끝날 수 있습니다. 나는 여전히 그 즐거운 하루 감사합니다, 건배!
y
과 m
변수는 문자열이 아닌 정수 해! 예를 들어 2 월의 경우 30을 반환하는 잘못된 계산이 발생합니다. parseInt()
작동 하려면 함수를 사용해야 했습니다.
내 동료가 다음을 우연히 발견했습니다.
function daysInMonth(iMonth, iYear)
{
return 32 - new Date(iYear, iMonth, 32).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()
여분의 정확성을 원한다면 여분의 마일을 가고 밀리 초를 설정할 수 있습니다.
이것은 당신에게 현재 달 첫날과 마지막 날을 줄 것입니다.
'연도'를 변경해야하는 경우 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);
이 시도:
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);
}
아래 함수는 매월 마지막 날입니다.
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
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);
다음은 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