我试图找到两个给定日期之间的所有季度。
例如,如果当前日期是今天(2013年1月15日),而过去的日期是2012年1月1日,我应该得到以下结果: 2012年12月 2012年9月 2012年6月 2012年3月
我可以从当前日期开始扣除3个月,但这不准确,因为下面的测试表示:
[TestMethod]
public void FindAllQuaters_FromAGivenDate_TillAPastDate()
{
var dateFinder = new FindQuarter();
//Between Feb 2013 & Jan 2012
var dates = dateFinder.GetAllQuarters(new DateTime(2013, 02, 01), new DateTime(2012, 01, 01)).ToList();
Assert.IsTrue(dates.Count == 4);
Assert.IsTrue(dates.First().Month == 12);
Assert.IsTrue(dates.First().Year == 2012);
Assert.IsTrue(dates.Skip(1).First().Month == 9);
Assert.IsTrue(dates.Skip(1).First().Year == 2012);
Assert.IsTrue(dates.Skip(2).First().Month == 6);
Assert.IsTrue(dates.Skip(2).First().Year == 2012);
Assert.IsTrue(dates.Skip(3).First().Month == 3);
Assert.IsTrue(dates.Skip(3).First().Year == 2012);
}
}
public class FindQuarter
{
public IEnumerable<DateTime> GetAllQuarters(DateTime current, DateTime past)
{
while (current > past)
{
current = current.AddMonths(-3);
yield return current;
}
}
}
我怎样才能做到这一点?季度定义为3月,6月,9月和十二月。我还需要那个月的最后一个日期(我希望很快)。
编辑:这不起作用,因为它从指定日期开始扣除3个月,例如,如果当前日期是2013年2月,我减少3个月,我将在2012年11月而不是2012年12月。1月,2月,3月的任何日期都属于第一季度,即3月
4月,5月,6月的任何日期都属于第二季度,即6月
7月,8月,9月的任何日期都属于第三季度,即9月
10月,11月,12月的任何日期都属于第四季度,即12月
答案 0 :(得分:1)
你可以使用我写的some time ago下面的课程:
DateTime dt1 = new DateTime(2012, 1, 1);
DateTime dt2 = new DateTime(2013, 1, 15);
long countQuarters = Quarter.GetQuarters(dt1, dt2); // outputs 4
区:
public class Quarter
{
public static long GetQuarters(DateTime dt1, DateTime dt2)
{
double d1Quarter = GetQuarter(dt1.Month);
double d2Quarter = GetQuarter(dt2.Month);
double d1 = d2Quarter - d1Quarter;
double d2 = (4 * (dt2.Year - dt1.Year));
return Round(d1 + d2);
}
private static int GetQuarter(int nMonth)
{
if (nMonth <= 3)
return 1;
if (nMonth <= 6)
return 2;
if (nMonth <= 9)
return 3;
return 4;
}
private static long Round(double dVal)
{
if (dVal >= 0)
return (long)Math.Floor(dVal);
return (long)Math.Ceiling(dVal);
}
}
答案 1 :(得分:1)
我认为您可以使用%
运算符。例如:
if (dt1.Month % 3 == 0)
{
// it is a quarter end, else it's not.
}
答案 2 :(得分:1)
这似乎有效。
public IEnumerable<DateTime> GetAllQuarters(DateTime current, DateTime past)
{
var curQ = (int)Math.Ceiling(current.Month / 3.0M);
var lastQEndDate = new DateTime(current.Year, curQ * 3, 1).AddMonths(-2).AddDays(-1);
do
{
yield return lastQEndDate;
lastQEndDate = lastQEndDate.AddMonths(-3);
} while (lastQEndDate > past);
}
答案 3 :(得分:1)
我知道这是一个旧线程,但这里有一个Lambda表达式来获取这些信息:
private static List<Tuple<DateTime, DateTime>> GetQuarterDates(DateTime startDate, DateTime endDate)
{
List<Tuple<DateTime, DateTime>> quarterDates = new List<Tuple<DateTime, DateTime>>();
quarterDates = Enumerable.Range(0, (endDate - startDate).Days)
.Where(x => startDate.AddMonths(x).Date == new DateTime(startDate.AddMonths(x).Year, (((startDate.AddMonths(x).Month - 1) / 3 + 1) - 1) * 3 + 1, 1))
.Select(x => new Tuple<DateTime, DateTime>(startDate.AddMonths(x), startDate.AddMonths(x + 3).AddDays(-1)))
.Where(x => x.Item2 <= endDate).ToList();
return quarterDates;
}