2008-10-21 4 views
191

, если вы предоставляете 0 как dayValue в Date.setFullYear вы получите последний день предыдущего месяца:Рассчитать последний день месяца в JavaScript

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

Там есть ссылка на это поведение в mozilla. Является ли это надежной кросс-браузерной функцией или я должен смотреть на альтернативные методы?

+0

Не имеете в виду последний день месяца, указанный? Есть 30 дней в ноябре и 31 октября. – 2008-10-21 15:38:44

+10

Месяцы основаны на нулевом значении в javascript, так что 11 декабря – Greg 2008-10-21 15:40:31

+1

@TheCloudlessSky - попробуйте в консоли ... (2008,11,0) - это нулевой день декабря, и поэтому последний день ноября – Ken 2011-09-05 07:24:54

ответ

285
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 в качестве последнего дня предыдущего месяца, это не значит, что они будут продолжать это делать или что браузеры, не перечисленные в списке, сделают это, но это придает уверенность в том, что он должен работать одинаково в каждом браузере.

-2

Нет, не все браузеры будут использовать 0 в качестве последнего дня. IE и Firefox будут, но Opera не будет.

Заканчивать следующий источник для получения дополнительной информации:

Last day of Month

+4

Я не уверен, что наблюдение является точным. Посмотрите мои результаты, особенно те, что для Opera 8.54, 9.27 и 9.60. – 2008-10-21 16:10:50

+1

Это должно быть комментарий (по любому из решений, зависящих от `0`). Это еще не полный ответ. – 2015-02-23 09:35:29

59

Я хотел бы использовать промежуточную дату с первым днем ​​следующего месяца, и возвращаю дату предыдущего дня:

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

это лучшее решение IMO. Я пробовал принятый ответ, но у него есть ошибка при получении последнего из текущего месяца. Он возвращает сегодняшнюю дату. Не знаю, почему это происходит. – Gogol 2014-03-13 11:26:38

+0

Я не могу воспроизвести ошибку. Это дает мне правильную дату во всех браузерах: `today = new Date(); new Date (today.getFullYear(), today.getMonth() + 1, 0) .toString(); ` – orad 2014-04-24 22:35:29

+0

Создает объект Date для последнего дня месяца со временем, установленным на последнюю миллисекунду (т.е. 23:59 : 59,999). Лучше просто использовать метод в OP и сохранить дополнительный объект Step и Date. – RobG 2014-04-30 22:59:41

9

небольшая модификация для решения обеспечивается lebreeze:

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

попробовать это.

lastDateofTheMonth = new Date(year, month, 0) 

пример:

new Date(2012, 8, 0) 

выход:

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

Я считаю, что это самое лучшее решение для меня. Пусть объект Date вычислит его для вас.

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

Установка параметра дня на 0 означает на один день меньше, чем первый день месяца, который является последним днем ​​предыдущего месяца.

12

С вычислительной точки зрения, new Date() и regular expression решения slow! Если вы хотите супер-быстрый (и сверхкритический) однострочный, попробуйте этот вариант (если 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); 
} 

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), а также следующая бинарная логика.

Быстрый урок в двоичных месяцах:

Если интерпретировать индекс желаемые месяцев (январь = 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

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

Это работает для меня. Обеспечит последний день данного года и месяца:

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

Это один работает хорошо:

Date.prototype.setToLastDateInMonth = function() { 

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

    return this; 
} 
0

набор месяц вам нужно на сегодняшний день, а затем установить на следующий день к нулю, так что месяц начать в 1 - 31 в дату функции затем получить последний день ^^

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

Я знаю, что это просто вопрос семантики, но я в конечном итоге использовать его в этой форме.

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

Поскольку функции разрешены из внутреннего аргумента, наружу, он работает одинаково.

Затем вы можете просто заменить год и месяц/год необходимой информацией, будь то с текущей даты. Или конкретный месяц/год.

0

Я думаю, что лучшее решение, как это:

var date = new Date(); 
var lastDay = new Date(date.getFullYear(), date.getMonth() + 1); 
lastDay.setDate(1); 
lastDay.setHours(-1); 
lastDay.setHours(23); 
lastDay.setMinutes(59); 
lastDay.setSeconds(59); 

Для выбранной даты, вы можете легко установить spesific дату

var date = new Date('2017-07-04'); //Y-m-d format. 
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 
Смежные вопросы