Как узнать четверть данной даты
Ниже приведены кварталы за финансовый год.
April to June - Q1
July to Sep - Q2
Oct to Dec - Q3
Jan to March - Q4
Если месяц входной даты лежит, как указано выше, мне нужен вывод в терминах номера четверти.
Например,
Если я даю входную дату (скажем январь 2), мне нужен вывод как Q4
.
Если я укажу ввод как (июнь 5), вывод должен дать Q1
.
На основе даты ввода мне нужен номер четверти.
Ответы
Ответ 1
Вы можете просто написать метод
public static int GetQuarter(DateTime date)
{
if (date.Month >= 4 && date.Month <= 6)
return 1;
else if (date.Month >= 7 && date.Month <= 9)
return 2;
else if (date.Month >= 10 && date.Month <= 12)
return 3;
else
return 4;
}
Ответ 2
Если вы предпочитаете короткие и сжатые решения без разветвлений и массивов, вот мое предпочтительное решение.
Обычный квартал:
public static int GetQuarter(this DateTime date)
{
return (date.Month + 2)/3;
}
Финансовый год квартал:
public static int GetFinancialQuarter(this DateTime date)
{
return (date.AddMonths(3).Month + 2)/3;
}
Целочисленное деление будет усекать десятичные числа, давая вам целочисленный результат. Поместите методы в статический класс, и у вас будет метод расширения, который будет использоваться следующим образом:
date.GetQuarter()
date.GetFinancialQuarter()
Ответ 3
Это для "нормального года", я думаю, вы можете адаптировать образец
String.Format( "Q {0}", (date.Month + 2)/3);
Ответ 4
public static int GetQuarter(DateTime date)
{
int[] quarters = new int[] { 4,4,4,1,1,1,2,2,2,3,3,3 };
return quarters[date.Month-1];
}
Ответ 5
Метод расширения и меньшие сравнения:
public static class DateTimeExtension
{
public static int GetQuarter(this DateTime dateTime)
{
if (dateTime.Month <= 3)
return 1;
if (dateTime.Month <= 6)
return 2;
if (dateTime.Month <= 9)
return 3;
return 4;
}
}
Ответ 6
int CurrentQuarter = (int)Math.Floor(((decimal)DateTime.Today.Month + 2) / 3);
или измените DateTime.Today на требуемую дату.
Ответ 7
в sql, просто
((((month(@mydate)-1)/3)+3) % 4) + 1
проверьте это следующим образом:
declare @mydate datetime
set @mydate = '2011-01-01'
while @mydate <= '2011-12-31'
begin
print ((((month(@mydate)-1)/3)+3) % 4) + 1
set @mydate = dateadd(month, 1, @mydate)
end
Или, если вы хотите сделать это в .net, ему нравится
String.Format("Q{0}", ((((date.Month-1)/3)+3) % 4) + 1);
Ответ 8
Самый простой и последовательный способ достижения этого:
Обычный
Math.Ceiling(date.Month / 3.0)
Финансовый (только сдвинутый с модом на 2 + 1 квартал)
Math.Ceiling(date.Month / 3.0 + 2) % 4 + 1
01.01.2016 00:00:00 -> Q1 -> FQ4
01.02.2016 00:00:00 -> Q1 -> FQ4
01.03.2016 00:00:00 -> Q1 -> FQ4
01.04.2016 00:00:00 -> Q2 -> FQ1
01.05.2016 00:00:00 -> Q2 -> FQ1
01.06.2016 00:00:00 -> Q2 -> FQ1
01.07.2016 00:00:00 -> Q3 -> FQ2
01.08.2016 00:00:00 -> Q3 -> FQ2
01.09.2016 00:00:00 -> Q3 -> FQ2
01.10.2016 00:00:00 -> Q4 -> FQ3
01.11.2016 00:00:00 -> Q4 -> FQ3
01.12.2016 00:00:00 -> Q4 -> FQ3
Результат - это значение от 1 до 4. Почти любая среда имеет функцию CEIL, поэтому это должно работать и на любом языке.
Ответ 9
Вы можете просто сделать это:
for (int i = 1; i <= 12; i++) {
Console.WriteLine("Month {0} - Q{1}", i, Math.Ceiling((i <= 3 ? 12 - i + 1 : i - 3) / 3M));
}
Выход будет:
![введите описание изображения здесь]()
Ответ 10
Этот метод позволяет указать начальный месяц квартала, а также указать год за период в целом.
public string GetQuarterPeriod(DateTime date, int quarterStartMonth)
{
var quarterDateOffset = date.AddMonths(1 - quarterStartMonth);
return $"Q{Math.Ceiling((decimal)quarterDateOffset.Month / 3)} {quarterDateOffset.Year}"
+ (quarterStartMonth == 1 ? "" : $"/{quarterDateOffset.Year + 1}");
}
Дарение:
GetQuarterPeriod(new DateTime(2018, 4, 1), 4) -> "Q1 2018/2019"
GetQuarterPeriod(new DateTime(2018, 1, 1), 1) -> "Q1 2018"
Функция объясняет тот факт, что если месяц - январь (1), он ограничен одним годом.