1

希望一切都好起来!

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

这是一个 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));
    }

如果时间没有超过午夜,这很有效。前任:

  • 开放时间:07:00(上午 7:00)
  • 关闭时间:10:00(上午 10:00)

将按预期填充:

  • 07:00:00
  • 07:15:00
  • 07:30:00
  • 07:45:00
  • .
  • .
  • 10:00:00

这不起作用的地方是开放时间在午夜之前开始,而关闭时间在之后开始。

  • 开放时间:11:00(上午 11:00)
  • 关闭时间:02:00(凌晨 2:00)

我需要填充

  • 11:15:00
  • 11:30:00
  • 11:45:00
  • .
  • .
  • .
  • 2:00:00

但正如您可以很快看出的那样,循环不会运行,因为在这种情况下 openTime 不是 <= to closeTime。

简单地创建另一个 for 循环来检查 closeTime <= openTime 是否不会给出所需的结果。我会得到:

  • 02:00:00
  • 02:15:00
  • 02:30:00
  • .
  • .
  • .
  • 11:00:00

在这个主题上更有经验的人能否提供成功完成这项工作所需的逻辑。

谢谢你的时间,克里斯。

4

4 回答 4

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 点,那么它会正常工作。

如果您将打开/关闭时间设为 TimeSpan,您可以始终使用:

// 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类型,但那是另一回事 :)

于 2012-06-28T15:59:17.273 回答
0

TimeSpan如果您也担心日期,为什么要为此使用 a ?

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

于 2012-06-28T15:59:47.303 回答
0

我认为您在应该使用 DateTime 的地方使用 TimeSpan。

于 2012-06-28T16:00:06.093 回答
0

我看到了几个选项:

  1. 改用DateTime结构来增加 15 分钟。将DateTime.TimeOfDay数据作为您的数据。(这是我写这篇文章时其他人建议的)
  2. TimeSpan如果值超过 24h ,则包括减去 24h 的逻辑。

关于#1 的一个关键说明和其他人的建议是夏令时的不可逆转的时间变化。您必须验证您的序列在我们后退时没有重复,或者在我们向前跳时跳过 1h 块。

这有意义吗?

问候。

于 2012-06-28T16:05:15.177 回答