鉴于开始日期为2009年1月1日,结束日期为12/31/2009,如何迭代每个日期并使用c#检索DateTime值?
谢谢!
答案 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) ;