C# 如何在C语言中获取两个日期之间的日期

C# 如何在C语言中获取两个日期之间的日期,c#,linq,datetime,C#,Linq,Datetime,我想要两个日期之间的日期。我得到的不是9个不同的日期,而是875287,内存不足。下面的代码有什么问题 起始日期值为2016年4月1日00:00:00 结束日期值为2016年4月10日00:00:00 您没有将date.value.AddDays1的值分配给任何对象,因此它最终会进入一个无限循环。您需要更改代码,以便将日期设置为AddDays的结果 就我所见,由于方法返回DateTime的新实例,它不会更改当前实例,因为DateTime是 看起来您的日期是DateTime?,您可以将此部分更改为

我想要两个日期之间的日期。我得到的不是9个不同的日期,而是875287,内存不足。下面的代码有什么问题

起始日期值为2016年4月1日00:00:00

结束日期值为2016年4月10日00:00:00


您没有将date.value.AddDays1的值分配给任何对象,因此它最终会进入一个无限循环。您需要更改代码,以便将日期设置为AddDays的结果


就我所见,由于方法返回DateTime的新实例,它不会更改当前实例,因为DateTime是

看起来您的日期是DateTime?,您可以将此部分更改为

for (var date = StartDate; date <= EndDate; date = date.Value.AddDays(1))
{
    selectedDates.Add(date);
}

正如usr指出的,这可能会在DST上受到影响。您可能还想检查一下。

决定用do/while来更改它

var selectedDates = new List<DateTime?>();
DateTime? StartDate = DateTime.Parse("01/04/2016 00:00:00");
DateTime? EndDate = DateTime.Parse("10/04/2016 00:00:00");

do
{
    selectedDates.Add(StartDate);
    StartDate = StartDate.Value.AddDays(1);
}while(StartDate < EndDate);
解决方案让我们生成选定日期:


使用Linq的Range方法的一个较短的表示法,使用TimeSpan.days属性在从结束减去开始后计算出天数

假设开始时间早于结束时间,则最终结果是:

DateTime StartDate = new DateTime(1979, 10, 4);
DateTime EndDate = new DateTime(2016, 10, 4);

var dates = Enumerable.Range(0, (EndDate - StartDate).Days + 1)
    .Select(day => StartDate.AddDays(day))
如果需要将其设置为可空,请添加:

    .Cast<DateTime?>()

它可能比其他基于LINQ的解决方案效率更高。

这一点。与字符串一样,对DateTime对象的操作会返回一个新对象,而不是修改现有对象。根据OP的解释,这段代码可以编译并运行,该日期看起来像DateTime?,不是DateTime,因为DateTime没有名为Value的属性。您更新的代码也不会编译,因为Nullable没有名为AddDays的方法。@Janesabouchleich抱歉,大脑疲劳,我不知道他们是如何得到无限循环的可能的副本的。由于计算的增量性质,这不是有缺陷吗?如果StartDate是凌晨2:30,那么如果你进入夏令时,时间就会改变。AdDead不象一个整数。@您是对的,DATETIME结构不考虑算术运算中的DST。但根据OP的开始和结束日期,情况不应该如此。将我的答案更新为德米特里的答案。谢谢。它的性能非常糟糕,因为它将列表扩展了很多倍。这是最好的答案,因为它避免了反模式的增量计算。甚至不确定AddDays1的想法是否正确。为什么需要创建新的日期时间?选择StartDate.AddDaysindex的返回值会有什么问题?@AshBurlaczenko:StartDate.AddDays的返回值为DateTime,但询问者在问题中使用了列表。新的约会时间?只是将返回值强制到目标类型的一种方式。@Mou:如果我理解正确,您会对我没有添加任何项感到困惑。好吧,与其在现有列表中添加var selectedDates=新列表;对于添加我只是创建了它:在执行Linq查询之后,selectedDates将显示为一个包含所需日期的列表
  var selectedDates = Enumerable
    .Range(0, int.MaxValue)
    .Select(index => new DateTime?(StartDate.AddDays(index)))
    .TakeWhile(date => date <= EndDate)
    .ToList();
DateTime StartDate = new DateTime(1979, 10, 4);
DateTime EndDate = new DateTime(2016, 10, 4);

var dates = Enumerable.Range(0, (EndDate - StartDate).Days + 1)
    .Select(day => StartDate.AddDays(day))
    .Cast<DateTime?>()
    .ToList()