我希望我已经解决了这个问题,但看起来我们今天早上遇到了一些错误。
这是一个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不是&lt; = to closeTime。
只需创建另一个for循环来检查closeTime&lt; = openTime是否不会产生所需的结果。 我会得到:
任何对这个主题更有经验的人都可以提供成功运作所需的逻辑。
谢谢你的时间,克里斯。
答案 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)
我看到了几个选项:
DateTime
结构代替15分钟增量。取数据DateTime.TimeOfDay
作为数据。 (这是我写这篇文章时其他人的建议)TimeSpan
值超过24小时,则包含减去24h的逻辑。关于#1的一个关键注意事项以及其他人的建议是夏令时的时间变化。当我们退回时你必须验证你的序列没有重复,或者当我们向前跳过时跳过1h的块。
这是否有意义?
问候。