如果您在0
dayValue
中提供Date.setFullYear
,则会获得上个月的最后一天:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
在mozilla处有对此行为的引用。这是一个可靠的跨浏览器功能还是我应该考虑其他方法?
答案 0 :(得分:355)
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作为上个月的最后一天并不意味着他们会继续这样做,或者未列出的浏览器会这样做,但它会让人相信它应该在每个浏览器中以相同的方式工作。
答案 1 :(得分:72)
我会在下个月的第一天使用中间日期,并返回前一天的日期:
int_d = new Date(2008, 11+1,1);
d = new Date(int_d - 1);
答案 2 :(得分:56)
我觉得这对我来说是最好的解决方案。让Date对象为你计算它。
var today = new Date();
var lastDayOfMonth = new Date(today.getFullYear(), today.getMonth()+1, 0);
将day参数设置为0表示比上个月的最后一天月份的第一天少一天。
答案 3 :(得分:22)
在计算机术语中,new Date()
和regular expression
解决方案慢!如果你想要一个超快速(超级神秘)的单行,请试试这个(假设m
采用Jan=1
格式)。我一直在尝试不同的代码更改以获得最佳性能。
我当前最快的版本:
在查看相关问题Leap year check using bitwise operators (amazing speed)并发现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,所以我创建了一个头对头的JSPerf供我们测试:http://jsperf.com/days-in-month-head-to-head/5
它基于我的闰年答案:javascript to find leap year此答案Leap year check using bitwise operators (amazing speed)以及以下二进制逻辑。
二元月份的快速课程:
如果您在二进制中解释所需月份(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个位置,将原始^ m
的位置转换为XOR,然后查看结果是1
还是0
在位置0 使用& 1
。注意:结果+
略快于XOR(^
),(m >> 3) + m
在位0中得到相同的结果。
答案 4 :(得分:17)
我的同事偶然发现了以下可能更容易解决的问题
function daysInMonth(iMonth, iYear)
{
return 32 - new Date(iYear, iMonth, 32).getDate();
}
答案 5 :(得分:12)
对 lebreeze :
提供的解决方案略有修改function daysInMonth(iMonth, iYear)
{
return new Date(iYear, iMonth, 0).getDate();
}
答案 6 :(得分:3)
这对我有用。 将提供给定年份和月份的最后一天:
B/op
答案 7 :(得分:3)
试试这个。
lastDateofTheMonth = new Date(year, month, 0)
示例:
new Date(2012, 8, 0)
输出:
Date {Fri Aug 31 2012 00:00:00 GMT+0900 (Tokyo Standard Time)}
答案 8 :(得分:2)
我最近不得不做类似的事情,这就是我想出的:
/**
* 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()
设置毫秒。
答案 9 :(得分:1)
这个很好用:
Date.prototype.setToLastDateInMonth = function () {
this.setDate(1);
this.setMonth(this.getMonth() + 1);
this.setDate(this.getDate() - 1);
return this;
}
答案 10 :(得分:1)
这将为您提供当月和第一天的当前日期。
如果您需要更改'年',请删除d.getFullYear()并设置您的年份。
如果您需要更改'月',请删除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);
答案 11 :(得分:0)
如果您只需要为我计算出一个月的最后一天。
var d = new Date();
const year = d.getFullYear();
const month = d.getMonth();
const lastDay = new Date(year, month +1, 0).getDate();
console.log(lastDay);
在这里试试https://www.w3resource.com/javascript-exercises/javascript-date-exercise-9.php
答案 12 :(得分:0)
这将为您提供当月的最后一天。
注意:在 ios 设备上包括时间。 #gshoanganh
var date = new Date();
console.log(new Date(date.getFullYear(), date.getMonth() + 1, 0, 23, 59, 59));
答案 13 :(得分:0)
您可以通过以下代码获取当月的第一个和最后一个日期:
var dateNow = new Date();
var firstDate = new Date(dateNow.getFullYear(),dateNow.getMonth(),1);
var lastDate = new Date(dateNow.getFullYear(),dateNow.getMonth()+ 1,0);
,或者如果您想以自定义格式设置日期格式,则可以使用js时刻
var dateNow = new Date();
var firstDate = moment(new Date(dateNow.getFullYear(),dateNow.getMonth(),1))。format(“ DD-MM-YYYY”);
var currentDate = moment(new Date())。format(“ DD-MM-YYYY”); //获取当前日期var lastDate = moment(new Date(dateNow.getFullYear(),dateNow.getMonth()+ 1, 0))。format(“ DD-MM-YYYY”); //最后一个月的日期
答案 14 :(得分:0)
接受的答案对我不起作用,我做了如下操作。
$( function() {
$( "#datepicker" ).datepicker();
$('#getLastDateOfMon').on('click', function(){
var date = $('#datepicker').val();
// Format 'mm/dd/yy' eg: 12/31/2018
var parts = date.split("/");
var lastDateOfMonth = new Date();
lastDateOfMonth.setFullYear(parts[2]);
lastDateOfMonth.setMonth(parts[0]);
lastDateOfMonth.setDate(0);
alert(lastDateOfMonth.toLocaleDateString());
});
});
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<link rel="stylesheet" href="/resources/demos/style.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
</head>
<body>
<p>Date: <input type="text" id="datepicker"></p>
<button id="getLastDateOfMon">Get Last Date of Month </button>
</body>
</html>
答案 15 :(得分: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())
答案 16 :(得分: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);
答案 17 :(得分:0)
这是保存格林尼治标准时间和初始日期时间的答案
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
答案 18 :(得分:0)
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);
}
答案 19 :(得分: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
答案 20 :(得分:0)
我知道这只是一个语义问题,但我最终以这种形式使用它。
var lastDay = new Date(new Date(2008, 11+1,1) - 1).getDate();
console.log(lastDay);
由于函数是从内部参数向外解析的,因此它的工作方式相同。
然后,您可以使用所需的详细信息替换年份和月份/年份,无论是否来自当前日期。或者特定的月/年。
答案 21 :(得分:0)
设置你需要约会的月份,然后将日期设置为零,所以月份开始于1 - 31日期函数然后获取最后一天^^
var last = new Date(new Date(new Date().setMonth(7)).setDate(0)).getDate();
console.log(last);
答案 22 :(得分: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));
}