2012-02-22 14 views
2

我正在寫一個服務,在下午4點和5點調用方法。我想保持這些時間不被硬編碼,所以我想將它們放在我的appconfig中。只有Time參數的DateTime.TryParse?

這裏是我的代碼有:

public bool CheckTime() 
     { 
      DateTime startTime; 
      DateTime endTime; 

      DateTime.TryParse(ConfigurationManager.AppSettings["ProcessingStartTime"], out startTime); 
      DateTime.TryParse(ConfigurationManager.AppSettings["ProcessingEndTime"], out endTime); 

      if(DateTime.Now.TimeOfDay.Equals(startTime) || DateTime.Now.TimeOfDay.Equals(endTime)) 
       return true; 
      else 
       return false; 
     } 

但是,因爲我只希望存儲時間爲一個字符串,我如何解析和封裝只是(東西爲「4:00」一樣簡單)在DateTime對象中的時間?還是有另一個對象?我不關心日期,它只是任何給定年份任何給定周的M-F。

謝謝你們。

回答

8

您可以使用帶有適當格式字符串的TryParseExact,然後忽略日期。 .NET中「僅僅一次」沒有很好的封裝。然而,有一個選擇 - 我一直在Noda Time它具有LocalTime型只是爲此努力:

// "Traditional" way 
LocalTime time; 
if (LocalTime.TryParseExact(text, "h:mmtt", out time)) 
{ 
    ... 
} 

// Preferred way 

private static readonly LocalTimePattern TimePattern = 
    LocalTimePattern.CreateWithInvariantInfo("h:mmtt"); 
... 

ParseResult<LocalTime> parseResult = TimePattern.Parse(text); 
if (parseResult.Success) 
{ 
    LocalTime time = parseResult.Value; 
    ... 
} 

兩個並排的注意事項:

  • 這幾乎從未適當忽略從DateTime.TryParse(或任何其他TryParse方法)的返回值 - 如果數據有問題,您是否真的想使用DateTime.MinValue?有箱子這裏的默認值是合適的,但他們是非常罕見的
  • 請儘量避免形式的代碼:

    if (condition) 
        return true; 
    else 
        return false; 
    

    這更清楚地寫爲:

    return condition; 
    
+0

我剛剛看到維基 - 華麗!很高興知道我不是唯一一個在.Net中看到DateTime類的「缺點」的人。我希望我的情況能夠很好地提醒我們爲什麼需要野田時間這樣的項目(用例)。謝謝,繼續保持! – 2012-02-22 20:10:48

+0

@fullNelson:我認爲這對我來說可能是一種解脫,我並不孤單,認爲這是一個空白......給我花了它的時間:) – 2012-02-22 20:12:32

+0

關於代碼糾正,是你說我應該內聯我的狀態邏輯,並讓該邏輯的評估隱含地返回真或假? – 2012-02-22 20:17:05