循环开始结束时间跨度

时间:2012-06-28 15:57:06

标签: c# asp.net .net datetime timespan

希望一切都好起来!

我希望我已经解决了这个问题,但看起来我们今天早上遇到了一些错误。

这是一个asp.net Web应用程序,此部分位于c#中。我们使用openTime,closeTime和15分钟的Interval动态填充下拉列表,这些类型都是TimeSpan类型。

TimeSpan interval = new TimeSpan(0,15,0);

    for (TimeSpan i = openTime; i <= closeTime; i = i.Add(interval))
    {

        string stringTime = i.ToString();
        ddlTime.Items.Add(new ListItem(stringTime, stringTime));
    }

如果时间不超过午夜时间,那么效果很好。例如:

  • openTime:07:00(早上7点)
  • closeTime:10:00(上午10点)

将按预期填充:

  • 7点○○分00秒
  • 07:15:00
  • 07:30:00
  • 07:45:00
  • 10:00:00

如果这不起作用,则是在午夜之前开始时间,并且在之后开始关闭时间。

  • openTime:11:00(上午11点)
  • closeTime:02:00(凌晨2点)

我需要填充

  • 11时15分○○秒
  • 11时30分00秒
  • 11点45分○○秒
  • 2点00分00秒

但是你可以很快地告诉我,循环不会运行,因为在这种情况下openTime不是&lt; = to closeTime。

只需创建另一个for循环来检查closeTime&lt; = openTime是否不会产生所需的结果。 我会得到:

  • 02:00:00
  • 2时十五分00秒
  • 2时三十分00秒
  • 11:00:00

任何对这个主题更有经验的人都可以提供成功运作所需的逻辑。

谢谢你的时间,克里斯。

4 个答案:

答案 0 :(得分:4)

听起来最好为每个开始和结束创建一个DateTime,然后循环那个直到你到达终点,取TimeOfDay为每个值:

TimeSpan interval = TimeSpan.FromMinutes(15);

for (DateTime current = openTime; current <= closeTime; current += interval)
{
    string stringTime = current.TimeOfDay.ToString();
    ddlTime.Items.Add(new ListItem(stringTime, stringTime));
}

现在,如果你有一个开放时间(比如)2012年6月28日晚上11点和2012年6月29日结束时间凌晨2点那么它将会正常工作。

如果您以TimeSpans的形式获得开放/关闭时间,则可以始终使用:

// The dates don't really matter here... we just want a sample start/end
// for an opening period
DateTime open = new DateTime(2000, 1, 1) + openTimespan;
DateTime close = new DateTime(2000, 1, 1) + closeTimespan;

if (open > close)
{
    close = close.AddDays(1);
}

当然,我个人建议使用我自己的.NET日期/时间API Noda Time,它具有特定的LocalTime类型,但这是另一回事:)

答案 1 :(得分:0)

如果您也关注日期,为什么要使用TimeSpan

使用DateTime.Add(new TimeSpan(0,0,interval))代替TimeSpan.Add(interval),并修改代码的其余部分以解决DateTime对象而不是TimeSpan对象。

答案 2 :(得分:0)

我认为您使用TimeSpan应该使用DateTime。

答案 3 :(得分:0)

我看到了几个选项:

  1. 使用DateTime结构代替15分钟增量。取数据DateTime.TimeOfDay作为数据。 (这是我写这篇文章时其他人的建议)
  2. 如果TimeSpan值超过24小时,则包含减去24h的逻辑。
  3. 关于#1的一个关键注意事项以及其他人的建议是夏令时的时间变化。当我们退回时你必须验证你的序列没有重复,或者当我们向前跳过时跳过1h的块。

    这是否有意义?

    问候。