首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找出两个日期之间的所有季度

问找出两个日期之间的所有季度
EN

Stack Overflow用户
提问于 2013-01-15 16:42:14
回答 4查看 5.7K关注 0票数 2

我想找出两个指定日期之间的每个季度。

例如,如果当前日期是今天(2013年1月15日),而过去的日期是2012年1月1日,那么我应该得到以下结果:2012年12月,2012年9月,2012年6月,2012年3月

我可以从现在的日期算出3个月,但这是不准确的,因为下面的测试表明:

代码语言:javascript
复制
  [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月。

  • 任何一月,二月,三月的日期都将属于第一季度。
  • 四月、五月、六月的任何日期都属于第二季度。
  • 七月、八月、九月的任何日期都将属于第三季度。
  • 10月、11月、12月的任何日期都将属于第四季度,即12月
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-15 17:14:30

这似乎很管用。

代码语言:javascript
复制
        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
EN

Stack Overflow用户

发布于 2013-01-15 16:47:48

你可以用下面的课我写的some time ago

代码语言:javascript
复制
DateTime dt1 = new DateTime(2012, 1, 1);
DateTime dt2 = new DateTime(2013, 1, 15);
long countQuarters = Quarter.GetQuarters(dt1, dt2); // outputs 4

季度:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2013-01-15 16:53:57

我想你可以用%接线器。例如:

代码语言:javascript
复制
if (dt1.Month % 3 == 0)
{
    // it is a quarter end, else it's not. 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14342482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档