2012-06-28 56 views
1

希望一切都很好!循環開始到結束時間過夜

我希望我已經破解這個問題,但它看起來像我們今天上午遇到了一些錯誤。

這是一個asp.net web應用程序,本節在c#中。我們使用openTime,closeTime和15分鐘的間隔動態填充下拉列表,這些類型都是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:00)
  • closeTime:10:00(10:00)

將填充預期:

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

如果這無法工作,就是當開啓時間午夜前開始,結束時間之後開始。

  • 的OpenTime:11:00(11:00)
  • closeTime:02:00(凌晨2:00)

我需要填充

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

但正如你可能會很快出來,循環將無法運行,因爲的OpenTime不< =到closeTime在這種情況下。

只需在創建另一個for循環,以檢查是否closeTime < =的OpenTime不會取得理想的結果。 我會得到:

  • 02:00:00
  • 二點15分00秒
  • 二時三十分零零秒
  • 11:00:00

任何人都可以對主題更有經驗的提供需要什麼樣的邏輯來得到這個成功的工作。

謝謝你的時間,克里斯。

回答

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點,那麼它會正常工作。

如果你打開/關閉時間爲時間跨度,你總是可以使用:

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

+0

嘿喬恩,再次感謝您的幫助!我解決了這個問題,如果開放時間較短,我會在關門時間增加一天,這樣,我的循環就會一直開始,處理正確的時間段。 – clamchoda

+0

@ChrisBuckler:酷 - 我已經修復了我的示例代碼,它被破壞:) –

0

爲什麼你使用TimeSpan這個,如果你也關心日期以及?

而不是TimeSpan.Add(interval),請使用DateTime.Add(new TimeSpan(0,0,interval)),並修改其餘代碼以解決DateTime對象而不是TimeSpan對象。

0

我認爲你使用TimeSpan你應該使用DateTime。

0

我看到一對夫婦的選擇:

  1. 使用DateTime結構,而不是做上15度分鐘的遞增值。以DateTime.TimeOfDay作爲你的數據。 (這是我寫這篇文章時其他人提出的)
  2. 如果TimeSpan的值超過24h,則包含減去24小時的邏輯。

一個鍵備註#1和別人的建議是節省時間爲日光inveitable時間的變化。當我們回落時,您必須驗證您的序列沒有重複,或者當我們向前跳時跳過1小時。

這是否使感官?

問候。

+0

我使用TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(stringid)爲指定的時區id加載時區信息對象。然後,我使用TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow,tzi)加載DateTime對象。 tzi obj實際上支持夏令時!感謝DateTime結構提示! – clamchoda

相關問題