Если вы предоставите 0
как dayValue
в Date.setFullYear
вас получить последний день предыдущего месяца:
d = new Date(); d.setFullYear(2008, 11, 0); // Sun Nov 30 2008
Существует ссылка на это поведение в Mozilla . Это надежная функция кросс-браузер или я должен смотреть на альтернативные методы?
javascript
date
кругозор
источник
источник
Ответы:
Различия на выходе связаны с различиями в
toString()
реализации, а не с тем, что даты разные.Конечно, только потому, что указанные выше браузеры используют 0 в качестве последнего дня предыдущего месяца, не означает, что они будут продолжать это делать, или что браузеры, не перечисленные в списке, будут делать это, но это вселяет доверие к убеждению, что это должно работать одинаково в каждом браузере.
источник
new Date
является так гораздо медленнее , чем другие методы расчета , что он даже не появляется на перфорация графике : jsperf.com/days-in-month-perf-test/6Я бы использовал промежуточную дату с первым днем следующего месяца и возвратил бы дату предыдущего дня:
источник
today = new Date(); new Date(today.getFullYear(), today.getMonth()+1, 0).toString();
Я считаю, что это лучшее решение для меня. Пусть объект Date рассчитает это для вас.
Установка параметра дня в 0 означает, что на один день меньше первого дня месяца, который является последним днем предыдущего месяца.
источник
new Date
это так гораздо медленнее даже не появляется на перфорации графике : jsperf.com/days-in-month-perf-test/6В компьютерном плане
new Date()
иregular expression
решения медленные! Если вам нужен супер-быстрый (и супер-загадочный) однострочный текст, попробуйте этот вариант (при условии, чтоm
он вJan=1
формате). Я продолжаю пробовать разные изменения кода, чтобы добиться максимальной производительности.Моя текущая самая быстрая версия:
Посмотрев на этот вопрос, связанный с проверкой високосного года с использованием побитовых операторов (потрясающая скорость) и обнаружив, что представляет собой магическое число 25 и 15, я пришел к этому оптимизированному гибриду ответов:
Учитывая сдвиг битов, это, очевидно, предполагает, что ваши параметры
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, чтобы найти високосный год, этот ответ здесь Проверка високосного года с использованием побитовых операторов (удивительная скорость), а также следующей двоичной логики.
Быстрый урок в бинарных месяцах:
Если вы интерпретируете индекс желаемых месяцев (Jan = 1) в двоичном виде, вы заметите, что месяцы с 31 днем либо имеют очищенный бит 3 и бит 0, либо установлен бит 3 и бит 0 сброшены.
Это означает, что вы можете сдвинуть значение на 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
переменные должны быть целым числом не строка! Это приводит к неправильным вычислениям, например, для февраля он возвращает 30. Я должен был использоватьparseInt()
функцию, чтобы это работало.Мой коллега наткнулся на следующее, что может быть более простым решением
украдено из http://snippets.dzone.com/posts/show/2099
источник
Небольшая модификация решения, предоставленная lebreeze :
источник
return new Date(iYear, 1 + iMonth, 0).getDate();
эквивалентно решению @ lebreeze.Недавно мне пришлось сделать что-то подобное, вот что я придумал:
Передайте его в дате, и он вернет дату, установленную либо на начало месяца, либо на конец месяца.
begninngOfMonth
Функция сама за себя, но то , что происходит в вendOfMonth
функции является то , что я приращение месяца на следующий месяц, а затем , используяsetDate(0)
откатить день до последнего дня предыдущего месяца , который является частью setDate spec: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 () и укажите свой год.
Если вам нужно изменить «месяц», удалите d.getMonth () и установите свой год.
источник
Попробуй это:
источник
Функция ниже дает последний день месяца:
Точно так же мы можем получить первый день месяца:
источник
источник
источник
установите месяц, который вам нужен, а затем установите день на ноль, чтобы месяц начинался с 1 - 31 в функции даты, а затем - последний день ^^
источник
Вот ответ, который сохраняет GMT и время начальной даты
источник
Я знаю, что это просто вопрос семантики, но я использовал это в этой форме.
Так как функции разрешаются из внутреннего аргумента, наружу, он работает так же.
Затем вы можете просто заменить год и месяц / год требуемыми данными, будь то текущая дата. Или определенный месяц / год.
источник
Если вам нужно точное окончание месяца в миллисекундах (например, в метке времени):
источник