Nityananda Das Ответов: 2

Как узнать дату окончания следующего месяца квартала ?


Как получить дату окончания квартала, как показано ниже?

Q1 - 30 апреля
Q2 - 31 июля
Q3 - 30 октября
Q4 - 31 января(следующего года)

Что я уже пробовал:

dueDate = new DateTime(year, MONTHS_IN_A_QUARTER * currQuarter + 1, 1).AddDays(-1);

Richard MacCutchan

И что же? В чем же вопрос?

CHill60

Это странные кварталы!
Q1 = с 1 января по 31 марта
Q2 = с 1 апреля по 30 июня
Q3 = с 1 июля по 30 сентября
Q4 = с 1 октября по 31 декабря

gggustafson

Почему ты так думаешь?

CHill60

ОП имеет 4-й квартал, заканчивающийся 31 января следующего года, и имеет 4 месяца в 1-м квартале

gggustafson

ОП, вероятно, починил его еще до того, как я его прочитал.

Nityananda Das

на самом деле требование таково. Мне нужно узнать дату окончания следующего месяца за квартал.
не могли бы вы мне помочь?

Richard MacCutchan

Скорее всего, их (финансовый) год начинается 1 февраля.

MadMyche

Некоторый контекст для того, что вы пытаетесь сделать, был бы очень полезен для нас, чтобы попытаться помочь вам.
На данный момент у вас есть 1 строка кода. Разве она не дает вам того, чего вы ожидаете? Не бросать исключение?
И кстати... пока они не поменяют календарь, в нем всегда будет 3 месяца

2 Ответов

Рейтинг:
4

Maciej Los

Если вы хотите получить дату окончания следующего месяца, попробуйте сделать это:

DateTime today = DateTime.Today;
DateTime EndOfNextMonth = today.AddMonths(2).AddDays(-today.Day);//add 2 months and subtract days passed in this month

Он возвращается 2020-06-30 на сегодняшнюю дату: 2020-05-06

На конец квартала:
DateTime EndOfQuarter = today.AddMonths(3-((today.Month+1) % 3)).AddDays(-today.Day);

Он возвращается 2020-07-31 на сегодняшнюю дату: 2020-05-06

Вы можете проверить это на следующем примере:
DateTime today = DateTime.Today;

for(int i = 1; i<=12; i++)
{
	DateTime tmp = new DateTime(2020, i, 1);
	int quarter = ((tmp.AddMonths(-1).Month +2) / 3);
	//int quarter = ((tmp.Month +1) / 3); - displays 0 in january
	int m2a = 3-((tmp.Month+1) % 3) ;
	DateTime eoq = tmp.AddMonths(m2a).AddDays(-tmp.Day);
	Console.WriteLine($"Date: {tmp.ToString("yyyy-MM-dd")} => EndOfQuarter {quarter}: {eoq.ToString("yyyy-MM-dd")}");
}


Результат:
Date: 2020-01-01 => EndOfQuarter 4: 2020-01-31
Date: 2020-02-01 => EndOfQuarter 1: 2020-04-30
Date: 2020-03-01 => EndOfQuarter 1: 2020-04-30
Date: 2020-04-01 => EndOfQuarter 1: 2020-04-30
Date: 2020-05-01 => EndOfQuarter 2: 2020-07-31
Date: 2020-06-01 => EndOfQuarter 2: 2020-07-31
Date: 2020-07-01 => EndOfQuarter 2: 2020-07-31
Date: 2020-08-01 => EndOfQuarter 3: 2020-10-31
Date: 2020-09-01 => EndOfQuarter 3: 2020-10-31
Date: 2020-10-01 => EndOfQuarter 3: 2020-10-31
Date: 2020-11-01 => EndOfQuarter 4: 2021-01-31
Date: 2020-12-01 => EndOfQuarter 4: 2021-01-31


phil.o

5 б

Maciej Los

Спасибо!

TheRealSteveJudge

Хорошие примеры! 5*

Maciej Los

Спасибо.

Рейтинг:
20

TheRealSteveJudge

Вы должны разделить расчет на более мелкие части
вместо того, чтобы пытаться запихнуть его в одну строку.
Это сделает его более понятным для понимания.

Первый шаг состоит в том, чтобы вычислить первый день квартала, как это:

var firstDayOfQuarter = new DateTime(year, 1 + (quarter - 1) * 3, 1);

Затем нужно прибавить 4 месяца и вычесть 1 день.
var dueDate = firstDayOfQuarter.AddMonths(4).AddDays(-1);

Метод расчета будет выглядеть следующим образом:
DateTime GetDueDate(int year, int quarter)
{
    var firstDayOfQuarter = new DateTime(year, 1 + (quarter - 1) * 3, 1);
    var dueDate = firstDayOfQuarter.AddMonths(4).AddDays(-1);

    return dueDate;
}


Maciej Los

5ed!

TheRealSteveJudge

Спасибо тебе, Мацей!