C# 给定开始和结束日期,以年/月/日/瞬时为单位获取最完整的间隔

C# 给定开始和结束日期,以年/月/日/瞬时为单位获取最完整的间隔,c#,date,C#,Date,给定一个开始和结束日期时间,如何获得“自然”年、月、日、瞬时的最完整间隔 谢谢你的帮助 [TestMethod] public void MoreThanOneYear() { var start = new DateTime(2013, 1, 5, 2, 0, 0); var end = new DateTime(2015, 5, 5, 19, 0, 0); var intervals = DateTimeUtis.GetPer

给定一个开始和结束日期时间,如何获得“自然”年、月、日、瞬时的最完整间隔

谢谢你的帮助

[TestMethod]
    public void MoreThanOneYear()
    {
        var start = new DateTime(2013, 1, 5, 2, 0, 0);
        var end = new DateTime(2015, 5, 5, 19, 0, 0);

        var intervals = DateTimeUtis.GetPeriods(start, end).ToList();

        Assert.IsTrue(intervals.Count() == 7);

        Assert.IsTrue(intervals[0].Granularity == Granularity.Instantaneous);
        Assert.IsTrue(intervals[0].Interval.Start == new DateTime(2013, 1, 5, 2, 0, 0));
        Assert.IsTrue(intervals[0].Interval.End == new DateTime(2013, 1, 6, 0, 0, 0));

        Assert.IsTrue(intervals[1].Granularity == Granularity.Daily);
        Assert.IsTrue(intervals[1].Interval.Start == new DateTime(2013, 1, 6, 0, 0, 0));
        Assert.IsTrue(intervals[1].Interval.End == new DateTime(2013, 2, 1, 0, 0, 0));

        Assert.IsTrue(intervals[2].Granularity == Granularity.Montly);
        Assert.IsTrue(intervals[2].Interval.Start == new DateTime(2013, 2, 1, 0, 0, 0));
        Assert.IsTrue(intervals[2].Interval.End == new DateTime(2014, 1, 1, 0, 0, 0));

        Assert.IsTrue(intervals[3].Granularity == Granularity.Yearly);
        Assert.IsTrue(intervals[3].Interval.Start == new DateTime(2014, 1, 1, 0, 0, 0));
        Assert.IsTrue(intervals[3].Interval.End == new DateTime(2015, 1, 1, 0, 0, 0));

        Assert.IsTrue(intervals[4].Granularity == Granularity.Montly);
        Assert.IsTrue(intervals[4].Interval.Start == new DateTime(2015, 1, 1, 0, 0, 0));
        Assert.IsTrue(intervals[4].Interval.End == new DateTime(2015, 5, 1, 0, 0, 0));

        Assert.IsTrue(intervals[5].Granularity == Granularity.Daily);
        Assert.IsTrue(intervals[5].Interval.Start == new DateTime(2015, 5, 1, 0, 0, 0));
        Assert.IsTrue(intervals[5].Interval.End == new DateTime(2015, 5, 5, 0, 0, 0));

        Assert.IsTrue(intervals[6].Granularity == Granularity.Instantaneous);
        Assert.IsTrue(intervals[6].Interval.Start == new DateTime(2015, 5, 5, 0, 0, 0));
        Assert.IsTrue(intervals[6].Interval.End == new DateTime(2015, 5, 5, 19, 0, 0));
    }
编辑

我试图实现的是在两个日期之间获得尽可能大的相邻间隔。完成年间隔>月>日>瞬时

编辑2


业务场景是,我有一个SQL表,其中包含1分钟频率的原始数据,还有3个表包含合并数据(按年、月和日)。因此,对于开始日期和结束日期,我需要获得允许我优化查询的日期和时间间隔。如果在开始日期和结束日期之间有完整的年份,我可以从合并年份表中获取数据,如果没有,我尝试从月份表中获取数据,依此类推。

通常,您不能。只是因为没有年和月的标准。您所能做的最佳近似值是确定您的情况下最合适的年份(365天、365.25天或其他一些规则)并使用/numberOfDaysInYear


另请参见:

不太清楚你在问什么。DateTime的
.Subtract()
方法是否不符合您的要求?可能重复的Subtract将给出两个日期之间的时间跨度,而不是我要查找的时段。我添加了这个测试,希望它能比我的文字更好地解释:)也许这就是你想要的:不完全是,但这是一个非常酷的字符串扩展集合:)我认为我上一次编辑更好地解释了我要做的事情。