如何从给定日期中找到季度的开始日期和名称(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);
var date = new DateTime(2015, 3, 15);
var quarter = (date.Month + 2) / 3;
var quarterStartMonth = 3 * quarter - 2;
var quarterStartDate = new DateTime(date.Year, quarterStartMonth, 1);
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(@"¯\_(ツ)_/¯");
}
}
注:这只能找到季度的第一天,但您可以轻松扩展此功能以查找季度号等。
"Original Answer"翻译成中文是"最初的回答"。
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);
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
var endDateInQtr = new DateTime(date.Year, totalMonths, DateTime.DaysInMonth(date.Year, totalMonths));
让我们从季度的开始日期开始。我认为这个更有用,而且更难找到一个整洁的实现方法。
public static DateOnly GetFirstDayOfCurrentQuarter(DateTime dateTime)
{
var month = dateTime.Month - (dateTime.Month - 1) % 3;
var result = new DateOnly(dateTime.Year, month, 1);
return result;
}
dateTime.Month - 1
),我们可以轻松地看到它超出季度开始的时间(% 3
)多少。我们从当前月份中减去超出的部分,就可以得到该季度的起始月份。1-4
)更加简单:var quarterNumber = (dateTime.Month - 1) / 3 + 1;
dateTime.Month - 1
),我们可以轻松地获得基于0的季度索引(/ 3
)。然后我们将其转换为季度数字(+ 1
)。
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();
这里有三个方法。一个是获取当前季度号,另外两个是获取开始日期和结束日期。
static (DateTime startDate, DateTime endDate) GetCurrentQuarter(DateTime date)
{
var year = date.Year;
var quarter = (int)Math.Ceiling(date.Month / 3d);
var start = GetStartDateOfQuarter(year, quarter);
var end = GetEndDateOfQuarter(year, quarter);
return (start, end);
}
static DateTime GetStartDateOfQuarter(int year, int quarter)
{
var month = quarter * 3 - 2;
return new DateTime(year, month, 1);
}
static DateTime GetEndDateOfQuarter(int year, int quarter)
{
var month = quarter * 3;
var daysInMonth = DateTime.DaysInMonth(year, month);
return new DateTime(year, month, daysInMonth);
}
然后进行测试目的:
var date = new DateTime(2023, 1, 1); // 2023-01-01
var (start, end) = GetCurrentQuarter(date);
Console.WriteLine("Start date of Current Quarter: {0}", start);
Console.WriteLine("End date of Current Quarter: {0}", end);
(quarterNumber-1)*3+1
将给出所给季度第一个月的月份。该代码创建了一个DateTime
对象,表示该年该月的第一天。这是该季度的第一天。然后它再加上三个月。那将是下一个季度的第一天,所以所需季度的最后一天将是前一天(.AddDays(-1)
完成此操作)。 - Fredrik Mörk((date.Month-1)/3) + 1
和((quarter-1)*3) + 1
等效。 - Joevar firstDayOfQuarter = new DateTime(date.AddMonths(-3).Year, (quarterNumber-1)*3+1,1);
。 - Dmitrii Polianskii