你如何遍历一年中的每一天?

时间:2009-02-10 19:20:40

标签: c# datetime

鉴于开始日期为2009年1月1日,结束日期为12/31/2009,如何迭代每个日期并使用c#检索DateTime值?

谢谢!

8 个答案:

答案 0 :(得分:77)

我会使用一个看起来像这样的循环

for(DateTime date = begin; date <= end; date = date.AddDays(1))
{
}

相应地设置开始和结束

答案 1 :(得分:19)

实现Iterator设计模式的另一个选项:

这可能听起来没必要,但我依赖于您如何使用此功能,您也可以实现Iterator design pattern

想一想。假设一切正常,你复制/粘贴“for”句子。突然作为要求的一部分,你必须迭代所有的日子,但跳过其中一些(如日历,跳过瞻礼日,周末,习俗等)。

您必须创建一个新的“剪切”并改为使用日历。然后搜索并替换所有你的。

在OOP中,可以使用Iterator模式实现。

来自维基百科:

  

在面向对象的编程中,Iterator模式是一种设计模式,其中迭代器用于按顺序访问聚合对象的元素,而不暴露其基础表示。 Iterator对象封装了迭代发生方式的内部结构。

所以我的想法是使用这样的结构:

        DateTime fromDate = DateTime.Parse("1/1/2009");
        DateTime toDate   = DateTime.Parse("12/31/2009");

        // Create an instance of the collection class
        DateTimeEnumerator dateTimeRange = 
                              new DateTimeEnumerator( fromDate, toDate );


        // Iterate with foreach
        foreach (DateTime day in dateTimeRange )
        {
            System.Console.Write(day + " ");
        }

然后,如果需要,您可以创建子类来实现不同的算法,一个使用AddDay(1),另一个使用AddDay(7)或其他简单使用Calendar。等等。

这个想法是降低对象之间的耦合。

同样,对于大多数情况来说,这样做会有些过分,但如果迭代形成系统的相关部分(比方说,你正在为企业创建某种通知)并且应该遵循不同的全球化

当然,基本实现将使用for。

public class DateTimeEnumerator : System.Collections.IEnumerable
{
    private DateTime begin;
    private DateTime end;

    public DateTimeEnumerator ( DateTime begin , DateTime end ) 
    {
        // probably create a defensive copy here... 
        this.begin = begin;
        this.end = end;
    }
    public System.Collections.IEnumerator GetEnumerator()
    {
        for(DateTime date = begin; date < end; date = date.AddDays(1))
        {
            yield return date;
        }
    }
}

只是一个想法:)

答案 2 :(得分:6)

DateTime dateTime = new DateTime(2009, 1, 1);    

while(dateTime.Year < 2010)
    {

      dateTime = dateTime.AddDays(1);
    }

答案 3 :(得分:5)

我使用MiscUtil及其扩展方法:

foreach(DateTime date in 1.January(2009)
                         .To(31.December(2009))
                         .Step(1.Days())
{
    Console.WriteLine(date);
}

答案 4 :(得分:3)

设置两个变量:

DateTime lowValue = DateTime.Parse("1/1/2009");
DateTime highValue = DateTime.Parse("12/31/2009");

然后,将一天添加到低值,直到它等于高值:

while (lowValue <= highValue)
{
   //Do stuff here
   lowValue = lowValue.AddDays(1);
}

或类似的东西。

答案 5 :(得分:2)

可能更可重用的替代方法是在DateTime上编写扩展方法并返回IEnumerable。

例如,您可以定义一个类:

public static class MyExtensions
{
    public static IEnumerable EachDay(this DateTime start, DateTime end)
    {
        // Remove time info from start date (we only care about day). 
        DateTime currentDay = new DateTime(start.Year, start.Month, start.Day);
        while (currentDay <= end)
        {
            yield return currentDay;
            currentDay = currentDay.AddDays(1);
        }
    }
}

现在,在调用代码中,您可以执行以下操作:

DateTime start = DateTime.Now;
DateTime end = start.AddDays(20);
foreach (var day in start.EachDay(end))
{
    ...
}

这种方法的另一个优点是,添加EveryWeek,EveryMonth等使得它变得微不足道。然后,这些都可以在DateTime上访问。

答案 6 :(得分:1)

int day; for (int i = 1; i<365;i++) { day++; }

抱歉,无法抗拒。

答案 7 :(得分:0)

DateTime current = DateTime.Parse("1/1/2009");
DateTime nextYear = current.AddYears(1);
do
{
    Console.WriteLine(current);
    current = current.AddDays(1);
} while (current < nextYear) ;