Как найти дату начала и название (1, 2, 3 и т. д.) квартала с заданной даты?
Рассчитать дату начала и название квартала от заданной даты
Ответы:
Что-то вроде (не проверено):
DateTime date;
int quarterNumber = (date.Month-1)/3+1;
DateTime firstDayOfQuarter = new DateTime(date.Year, (quarterNumber-1)*3+1,1);
DateTime lastDayOfQuarter = firstDayOfQuarter.AddMonths(3).AddDays(-1);
int GetQuarterName(DateTime myDate)
{
return (int)Math.Ceiling(myDate.Month / 3.0);
}
DateTime GetQuarterStartingDate(DateTime myDate)
{
return new DateTime(myDate.Year,(3*GetQuarterName(myDate))-2,1);
}
GetQuarterName
получает «следующее» целочисленное значение номера текущего месяца / 3.
GetQuarterStartingDate
использует выходные данные GetQuarterName
для определения значения месяца, части года исходной даты и 1 для представления первого дня возвращаемого месяца.
(Извините за бессмыслицу, у меня грипп. :( )
https://msdn.microsoft.com/en-us/library/ms127415(v=vs.110).aspx
using Microsoft.VisualBasic;
var quarter = DateAndTime.DatePart(DateInterval.Quarter, (DateTime)dateTimePickerDateTime.Value);
Я думаю, что это решение будет работать очень хорошо. Он занимает больше очереди, автобус очень многословен! `
private DateTime GetFirstDayOfYearlyQuarter(DateTime value)
{
switch (value.Month)
{
case 1:
case 2:
case 3:
return new DateTime(value.Year, 1, 1);
case 4:
case 5:
case 6:
return new DateTime(value.Year, 4, 1);
case 7:
case 8:
case 9:
return new DateTime(value.Year, 7, 1);
case 10:
case 11:
case 12:
return new DateTime(value.Year, 10, 1);
default:
throw new Exception(@"¯\_(ツ)_/¯");
}
}
`
P.S. Это находит только первый день квартала, но вы можете легко расширить это, чтобы найти номер квартала и т. д.
Простая двухстрочная версия с демо-версией здесь + нажмите F8< /strong> для запуска.
var date = DateTime.Now; //Give you own DateTime
int offset = 2, monthsInQtr = 3;
var quarter = (date.Month + offset) / monthsInQtr; //To find which quarter
var totalMonths = quarter * monthsInQtr;
var startDateInQtr = new DateTime(date.Year, totalMonths - offset, 1); //start date in quarter
Если вы ищете последний день квартала, используйте DateTime.DaysInMonth
var endDateInQtr = new DateTime(date.Year, totalMonths, DateTime.DaysInMonth(date.Year, totalMonths));
public static class DateTimeExtensions
{
public static DateTime StartOfQuarter(this DateTime _date)
{
var quarter = decimal.ToInt16(Math.Ceiling(_date.Month / 3.0m));
return new DateTime(_date.Year, quarter, 1);
}
}
использовать
var quarterStart = DateTime.Today.StartOfQuarter();
(quarterNumber-1)*3+1
даст номер первого месяца данного квартала. Код создаетDateTime
для первого дня этого месяца года. Это первый день четверти. Затем он добавляет три месяца. Это будет первый день следующего квартала, поэтому последний день желаемого квартала будет за день до него (.AddDays(-1)
делает этот трюк). 29.09.20093+1
, а не просто4
? 09.09.2014((date.Month-1)/3) + 1
и((quarter-1)*3) + 1
09.09.2014var firstDayOfQuarter = new DateTime(date.AddMonths(-3).Year, (quarterNumber-1)*3+1,1);
29.12.2016