.net 查找两个日期之间的所有季度

63lcw9qa  于 2022-12-24  发布在  .NET
关注(0)|答案(5)|浏览(171)

我正在查找两个给定日期之间的所有季度。
例如,如果当前日期是今天(2013年1月15日),过去的日期是2012年1月1日,我应该得到以下结果:供应信息2012年09月归档2012年06月归档
我可以继续从当前日期扣除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月和12月。我还需要该月的最后一天(我希望很快)。
编辑:这是行不通的,因为它不断扣除3个月从一个给定的日期,例如,如果当前日期是2013年2月,我减少3个月,我得到2012年11月,而不是2012年12月。

  • 一月、二月、三月中的任何日期都属于第一季度,即三月
  • 四月、五月、六月的任何日期都属于第二季度,即六月
  • 七月、八月、九月的任何日期都属于第三季度,即九月
  • 十月、十一月、十二月中的任何日期都属于第四季度,即十二月
siv3szwd

siv3szwd1#

这似乎是工作。

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);
        }
7uzetpgm

7uzetpgm2#

你可以使用下面的类我写了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);
    }
}

DEMO

yi0zb3m4

yi0zb3m43#

我认为你可以使用%操作符。例如:

if (dt1.Month % 3 == 0)
{
    // it is a quarter end, else it's not. 
}
nle07wnf

nle07wnf4#

我知道这是一个老线索,但这里有一个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;
    }
fjaof16o

fjaof16o5#

简单的公式得到季度差异

{
    int firstQuarter = getQuarter(first);
    int secondQuarter = getQuarter(second);
    return 1 + Math.Abs(firstQuarter - secondQuarter);
}

private static int getQuarter(DateTime date)
{
    return (date.Year * 4) + ((date.Month - 1) / 3);
}

相关问题