2012-07-22 48 views
4

我需要使用計劃在應用程序中使用24小時格式化日期時間執行一些計算。例如,17h + 12h = 5h。我試圖創建我自己的Time結構,並繞過TimeSpanDateTime。它工作正常,但我陷入了ToString的格式化。C#中結構體的一天中的時間#

確實,我當然希望我的結構能夠在任何文化下工作。起初,我正在考慮將格式委託給DateTime結構,並跳過所有不嚴格與時間相關的自定義格式。例如,我無法將此任務委託給TimeSpan,因爲它不處理某些文化中使用的AM/PM。舉例來說,在我的Time結構我寫道:

public string Format(string format, IFormatProvider provider) 
{ 
    return TimeFormat.Format(this, format, DateTimeFormatInfo.GetInstance(provider), provider); 
} 

// ... 

internal class TimeFormat 
{ 
    internal string Format(Time time, string format, DateTimeFormatInfo dtfi, IFormatProvider provider) 
    { 
     DateTime dt = new DateTime(DateTime.MinValue, 1, 1, time.Hours, time.Minutes, time.Seconds, time.Milliseconds); 

     /* Here I am checking what the 'format' string is made of 
     and filter-out anything that is not strictly-time related. */ 

     return dt.Format(format, provider); 
    } 
} 

我看了一下是怎麼DateTime結構的ToString方法落實到mscorlib程序。並waow ...考慮到這麼多的東西。我想或多或少地重寫它裏面的內容,但只保留與時間有關的內容,但所有內容都混雜在一起而不易理解。而且我注意到一些絕對不直接的東西也需要處理,比如希伯來格式等等。這會花費我更多的時間,而不是我期望重寫所有這些!尤其是我不想不明白我在做什麼。

所以總結起來:

  • 我如何創建一個的一天中的時間格式「兼容所有的文化」?
  • 上面一級,我正確使用DateTimeTimeSpan的包裝處理問題?我不能直接使用TimeSpan:它使用的是消極時間(我使用modulos的時間嚴格限制在0到23:59:59.999之間),它在某些文化中不處理AM/PM,它使用Day s 。對我來說,'當天的時間'與'時間跨度的時間'不同。
  • 我不需要處理時區或DST,也不需要閏秒,因爲我處於日曆不可知的環境中,但我希望能夠處理一天中的時間本地化格式。 (例如,使用'H'(或任何希伯來語,中文,泰米爾語或俄語字符)而不是':'或AM/PM來代替24小時格式)。

任何提示或幫助指向我的一些圖書館或教程將有所幫助!

在問這個問題之前,我看了一下this post,還看了一下this library,但是看起來我想實現的過於複雜。

回答

3

(我知道這是一個插件爲我自己的項目,但希望人們將看到它是完全相關的:)

任何提示或幫助指點我到一些圖書館或教程會有所幫助!

我是Noda Time庫的主要開發人員,它應該完成您想要的大部分功能。有關初始信息,請參閱user guide - 並隨時在此處或郵件列表中提出更多問題。

你想要的類型是​​。

是的,你說得都DateTimeTimeSpan不恰當這裏,也該格式/解析複雜:)

在Noda時間,你可以使用ToString方法與正常BCL類型,並有目前靜態Parse/TryParse/ParseExact/TryParseExact方法 - 但這些可能消失今晚:)相反,你應該使用LocalTimePattern:定義圖案一次(每個格式和文化),然後用它用於格式和解析。

在格式和解析方面,你需要非常清楚你需要什麼。野田時光在BCL上揹負着諸如AM/PM指示符之類的東西等等。事實上,由於沒有月/日的名字,所以只處理日時間會使變得更簡單 (和不同的日曆)擔心。您可以將t模式用於「short」,T用於特定文化的「long」模式 - 或指定自定義模式。自定義模式通常對機器對機器通信更有用;標準的對於面向用戶的格式更有用。

(目前你已「知道」存在的tT模式 - 儘管他們的用戶手冊中記載正在當然,在某些時候,我將創建方法,以使這個簡單的...)

+0

我將深入瞭解您的圖書館 – Guillaume 2012-07-22 08:26:25

+0

@Guillaume我一直在使用'NodaTime',並且幾乎沒有抓到它所做的事情,但存在像LocalTime和' LocalDate'使它非常值得。 – psubsee2003 2012-07-22 08:48:58