Конец месяца это какие числа
Напишите функцию getLastDayOfMonth(year, month) , возвращающую последнее число месяца. Иногда это 30, 31 или даже февральские 28/29.
- year – год из четырёх цифр, например, 2012.
- month – месяц от 0 до 11.
К примеру, getLastDayOfMonth(2012, 1) = 29 (високосный год, февраль).
Создадим дату из следующего месяца, но в день передадим 0:
function getLastDayOfMonth(year, month) < let date = new Date(year, month + 1, 0); return date.getDate(); >alert( getLastDayOfMonth(2012, 0) ); // 31 alert( getLastDayOfMonth(2012, 1) ); // 29 alert( getLastDayOfMonth(2013, 1) ); // 28
Обычно даты начинаются с 1, но технически возможно передать любое число, и дата сама себя поправит. Так что если передать 0, то это значение будет соответствовать «один день перед первым числом месяца», другими словами: «последнее число прошлого месяца».
Конец месяца это какие числа
Собственно такой вопрос. На в скидку, что приходит в голову сравнивать дату с 12-тью концами месяцев. Может существует более элегантное решение?
Если следущая дата первое число, то это посл.день месяца
производственный календарь уже отменили?
Если КонецДня(МояДата) = КонецМесяца(МояДата) Тогда
этоконецмесяца = введеннаядата = конецмесяца(введеннаядата)
этоконецмесяца = конецдня(введеннаядата) = конецмесяца(введеннаядата);
Если Месяц(Дата + 1) > Месяц(Дата) Тогда
вы чо? КонецМесяца = КонецДня(дата) = КонецМесяца(Дата)
(2) это УТ. Там нет календаря.
Хватит позориться.
Правильный ответ в (3).
(0) Жесть. Такие вопросы и Стаж: 5 г. 1 мес. 🙂
(0) да, не забудь учесть високосные годы для февраля )) ЛОЛ
а мне (7) нравится — красивше, без всяких Если.
(10) Неформализовано понятие в сабже «конец месяца».
Если «конец месяца» — это «последний день месяца», то правильный (первый правильный) в (3).
Если конец месяца — это последняя секунда (т.е., в интерпретации системной функции КонецМесяца), то (4) — тоже правильный.
😛
(10) Так это пятничная ветка такая.
(12) тогда лучше так :
Функция ЭтоКонецМесяца (Дата)
Возврат КонецДня(дата) = КонецМесяца(Дата);
КонецФункции
Давайте конкурс откроем — кто интереснее и увлекательнее выполнить поставленную задачу. Использовать функции КонецМесяца и Месяц- нельзя!
(15) это не уменьшает твой косяк в (6) 😉
(16) Паразитируя на (1):
ЭтоКонецМесяца=День(КонецДня(Дата)+1)=1
Или более загадочно
ЭтоКонецМесяца=Не(День(КонецДня(Дата)-1)
ЭтоКонецМесяца=?(КонецДня(ТекущаяДата())+1 = НачалоМесяца(КонецДня(ТекущаяДата()+1)), Истина, Ложь);
(12) За (7) убивать надо.
(16) самое элегантное у ТС в (0) 12 сравнений с 12-ю концами месяцев.
(21) что там неверно ?
(19) Пропустил скобку ЭтоКонецМесяца=Не(День(КонецДня(Дата))-1)
(17) там я конец года только не учёл=)
(21) я жить хочу.
мКонецМесяца = КонецДня(дата) = КонецМесяца(Дата)
PR злой сегодня 🙂
(16) Имхо, победит метод ТС:
Если дата = ПервыйКонец тогда
.
ИначеЕсли дата = ВторойКонец тогда
.
и т.д., и т.п. :))))
(16) вот без месяцев
Если День(КонецДня(Дата)) > День(КонецДня(Дата) + 1)
(28) Нужно стремиться к совершенству! Должен быть вариант еще лучше!
(28) так сложно т.к. високосные и т.п., лучше
Если дата+1= ПерваяДатаПервогоМесяца тогда
.
ИначеЕсли дата+1 = ПерваяДатаВторогоМесяца тогда
.
(23) Для того, чтобы понять это выражение, нужно напрячь мозг.
Причем совершенно без нужды.
Читабельность и простота кода очень важны.
(31) Так читабельней:
Если дата = ПерваяДатаПервогоМесяца-1 тогда
.
ИначеЕсли дата = ПерваяДатаВторогоМесяца-1 тогда
(27) Да ладно, я всегда такой :))
Суровый, но справедливый :))
(32) фу ты, я уж думал что ругаешся на использование переменной с именем предопределённой функции. не надо там ничо напрягать
НашГод = Год(НашаДата);
ЭтоВисокосныйГод = (НашГод%4=0) и (НашГод%100<>0 или НашГод%400=0);
Массив = Новый Массив();
Массив.Добавить(31);
Массив.Добавить(28 + Число(ЭтоВисокосныйГод);
Массив.Добавить(31);
Массив.Добавить(30);
Массив.Добавить(31);
Массив.Добавить(30);
Массив.Добавить(31);
Массив.Добавить(31);
Массив.Добавить(30);
Массив.Добавить(31);
Массив.Добавить(30);
Массив.Добавить(31);
С=0;
Для й=1 по 12 Цикл
Массив[й]=Массив[й]+С;
С = Массив[й];
КонецЦикла;
ЭтоКонецМесяца = Массив.Найти(ДеньГода(НашаДата))<>Неопределено;
(35) На это мне плевать.
Если из-за этого не будет работать код, то тебя суровая реальность ударит больно об стол лицом.
А вот за нечитабельный код никто не ударит, а жаль :))
мКонецМесяца = Месяц(Дата) <> Месяц(Дата+86400);
(32) ИМХО, тот случай здесь, когда такая конструкция допустима. Разве переменную-результат назвать получше.
Если Найти(Строка(ВведеннаяДата),»31.01″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»28.02″)>0 ИЛИ (Найти(Строка(ВведеннаяДата),»29.02″)>0 И ГодВисокосный()) Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»31.03″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»30.04″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»31.05″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»30.06″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»31.07″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»31.08″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»30.09″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»31.10″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»30.11″)>0 Тогда
ЭтоКонецМесяца=Истина;
ИначеЕсли Найти(Строка(ВведеннаяДата),»31.12″)>0 Тогда
ЭтоКонецМесяца=Истина;
Иначе
ЭтоКонецМесяца=Ложь;
КонецЕсли;
Начало и конец месяца
При работе с датами периодически приходится определять первый и последний день месяца по дате. Этим мы сейчас и займемся.
Для усечения даты в PostgreSQL есть функция date_trunc(поле, значение) . Работает она аналогично функции trunc для чисел.
SELECT date_trunc('day', timestamp '2023-02-17 13:25')
# | date_trunc |
---|---|
1 | 2023-02-17 00:00:00 |
Первый параметр функции date_trunc может принимать значения:
- microseconds
- milliseconds
- second
- minute
- hour
- day
- week
- month
- quarter
- year
- decade
- century
- millennium
Первый день месяца
С помощью функции date_trunc мы можем легко определить первый день месяца:
SELECT date_trunc('month', timestamp '2023-02-17 13:25')
# | date_trunc |
---|---|
1 | 2023-02-01 00:00:00 |
При желании можно привести результат к дате:
SELECT date_trunc('month', timestamp '2023-02-17 13:25')::date
# | date_trunc |
---|---|
1 | 2023-02-01 |
Первый день месяца можно получить преобразовав исходную дату в строку с годом и месяцем, а затем сделать обратное преобразование в дату, добавив 1-е число.
SELECT (to_char(timestamp '2023-02-17 13:25', 'YYYY-MM') || '-01')::date
# | date |
---|---|
1 | 2023-02-01 |
Последний день месяца
С последним днем месяца дела обстоят немножко сложнее. В месяце может быть от 28 до 31 дней в зависимости от месяца и года. Просто так подставить число в строку не получится.
На помощь нам придет получение первого числа месяца и добавление интервала в один месяц.
SELECT date_trunc('month', timestamp '2023-02-17 13:25') + interval '1 month' AS result
# | result |
---|---|
1 | 2023-03-01 00:00:00 |
Так мы получаем первое число следующего месяца. Теперь нам достаточно отнять один день и мы получим последний день текущего месяца:
SELECT date_trunc('month', timestamp '2023-02-17 13:25') + interval '1 month -1 day' AS result
# | result |
---|---|
1 | 2023-02-28 00:00:00 |
Итоговый запрос для получения дат первого и последнего дней месяца:
SELECT date_trunc('month', timestamp '2023-02-17 13:25') AS start, date_trunc('month', timestamp '2023-02-17 13:25') + interval '1 month -1 day' AS end
# | start | end |
---|---|---|
1 | 2023-02-01 00:00:00 | 2023-02-28 00:00:00 |
Добавление месяцев
Стоит отметить, как работает добавление месяцев к дате.
Если в исходной дате день месяца с 1 по 28, то в результате будет этот же день месяца.
SELECT timestamp '2023-02-17 13:25' + interval '1 month'
# | ?column? |
---|---|
1 | 2023-03-17 13:25:00 |
Для дней с 29 по 31 может получиться так, что после добавления нужного количества месяцев этого же числа не будет в месяце результата. В этом случае будет взят последний день месяца.
Например, к 31 января добавляем 1 месяц. 31 февраля не существует, поэтому результатом будет последний день февраля — 28 февраля (или 29 для високосного года).
SELECT date '2023-01-31' + interval '1 month'
# | ?column? |
---|---|
1 | 2023-02-28 00:00:00 |
Для високосного года:
SELECT date '2024-01-31' + interval '1 month'
# | ?column? |
---|---|
1 | 2024-02-29 00:00:00 |
Определение начала и конца года
Аналогично определению первого и последнего дня месяца можно найти первый и последний день года по дате.
SELECT date_trunc('year', timestamp '2023-02-17 13:25') AS start, date_trunc('year', timestamp '2023-02-17 13:25') + interval '1 year -1 day' AS end
# | start | end |
---|---|---|
1 | 2023-01-01 00:00:00 | 2023-12-31 00:00:00 |
9.11 Динамическое построение интервала
9.13 EXTRACT — извлечение из даты части (год, месяц, день. )
Конец месяца-это с какого числа?
Конец месяца — это последняя неделя перед зарплатой. Она всегда самая тяжелая и долгая.
с числа 25-26
Если месяц поделить на декады, то начало с 1 по 10, середина с 11 по 20, конец с 21 по 30(31). как-то так.
теперь 1 число, было 25.
Похожие вопросы
Ваш браузер устарел
Мы постоянно добавляем новый функционал в основной интерфейс проекта. К сожалению, старые браузеры не в состоянии качественно работать с современными программными продуктами. Для корректной работы используйте последние версии браузеров Chrome, Mozilla Firefox, Opera, Microsoft Edge или установите браузер Atom.