有没有一个 C# 函数可以在给定日期的情况下,提供最近一季度结束的最后一天?
例如:
var lastDayOfLastQuarter = SomeFunction(jan 3, 2010);
将 lastDayOfLastQuarter 设置为 2009 年 12 月 31 日。
public static DateTime NearestQuarterEnd(this DateTime date) {
IEnumerable<DateTime> candidates =
QuartersInYear(date.Year).Union(QuartersInYear(date.Year - 1));
return candidates.Where(d => d < date.Date).OrderBy(d => d).Last();
}
static IEnumerable<DateTime> QuartersInYear(int year) {
return new List<DateTime>() {
new DateTime(year, 3, 31),
new DateTime(year, 6, 30),
new DateTime(year, 9, 30),
new DateTime(year, 12, 31),
};
}
使用方法:
DateTime date = new DateTime(2010, 1, 3);
DateTime quarterEnd = date.NearestQuarterEnd();
这种方法的优点在于,如果您对季度的定义有异议(例如,财年与日历年不同),则可以轻松修改QuartersInYear
方法以处理此类情况。
AddMonths(-(d.Month-1) % 3))
将日期值移动到该季度第一个月的等效日,然后AddDays(-day)
回到上一个月的最后一天。 DateTime d = Datetime.Now;
DateTime lastDayOfLastQuarter = d.AddMonths(-((d.Month-1)%3)).AddDays(-d.Day);
Day = 1
,Month = 12
,Year = 2009
的情况下会失败。 - jason一个简单的函数可以计算最近完成月份的最后一天:
public static DateTime LastQuarter(DateTime date)
{
return new DateTime(date.Year, date.Month - ((date.Month - 1) % 3), 1).AddDays(-1);
}
public DateTime LastDayOfLastQuarter(DateTime date)
{
int result = (int)(date.Month/3)
switch (result)
{
// January - March
case 0:
return new DateTime(date.Year - 1, 12, 31);
// April - June
case 1:
return new DateTime(date.Year, 3, 31);
// July - September
case 2:
return new DateTime(date.Year, 6, 30);
// October - December
case 3:
return new DateTime(date.Year, 9, 30);
}
}
Func<int, int> q = (i) => { return ((i - 1) / 3) + 1; };
测试:
Enumerable.Range(1, 12).Select(i => q(i));
DateTime LastDayOfQuarter(DateTime today)
{
int quarter = (today.Month-1) / 3;
int lastMonthInQuarter = (quarter +1) * 3;
int lastDayInMonth = DateTime.DaysInMonth(today.Year, lastMonthInQuarter);
return new DateTime(today.Year, lastMonthInQuarter, lastDayInMonth);
}
DoMagic()
方法的一个特例,在任何情况下都可以神奇地解决你想要的问题 :-)。说真的,在基类库中没有这样的方法,但你肯定可以自己编写。 - Joey