2014-01-23 59 views
2

我目前允許用戶使用完整的圖案,像這樣設置其首選DateTime格式的日期模式:提取剛剛從一個完整的DateTime模式

var formats = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('f').ToList(); 
formats.AddRange(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('F')); 
formats.AddRange(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('g')); 
formats.AddRange(System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetAllDateTimePatterns('G')); 

該生產全模式字符串是這樣的:

dddd, MMMM d, yyyy h:mm tt 
dddd, MMMM d, yyyy hh:mm tt 
dddd, MMMM d, yyyy H:mm 
dddd, MMMM d, yyyy HH:mm 
MMMM d, yyyy h:mm tt 
dddd, d MMMM, yyyy h:mm:ss tt 
M/d/yyyy h:mm tt 

在UI中有一些地方我們不想顯示時間,因爲它在上下文中不相關。

有一種文化意識的BCL類,允許我從字符串中提取日期模式嗎?

實例API:基於@SteveWellens通訊

M/d/yyyy 

更新:

var datePattern = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.GetDatePattern("M/d/yyyy h:mm tt"); 

這將導致datePattern被設置爲我意識到日期/時間模式本身​​並不是文化變體,這是拋棄我的東西。換句話說,無論最終用戶使用什麼樣的文化,代表小時佔位符的「h」總是「h」。我創建了一個死的簡單擴展方法來獲得我想要的。 (希望這並不一定是一個字符串的擴展,但因爲它雜波智能感知)

public static string GetDatePattern(this string pattern) 
{ 
    // set a default pattern if none is specified 
    if (string.IsNullOrWhiteSpace(pattern)) 
     pattern = System.Globalization.CultureInfo.CurrentUICulture.DateTimeFormat.FullDateTimePattern; 

    var start = pattern.IndexOf("h", StringComparison.InvariantCultureIgnoreCase); 
    // cannot find the hour placeholder 
    if (start < 0) 
     return pattern; 
    return pattern.Substring(0, start -1); 
} 

注: 我仔細檢查了所有文化(CultureTypes.AllCultures)並且沒有standard date and time patterns開始與時間它們中的任何一個的模式,所以這是用於標準日期和時間模式的安全邏輯。自定義模式是一個完整的其他故事。

僅供參考,對於任何文化來說,最長的標準日期和時間模式爲48,以備將其保存到數據庫中。

+0

你見過這個嗎? http://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx如果是這樣,我不明白這個問題。 –

+0

當你說這個字符串是'文化意識'時,這是否意味着你可以使用適當的'CultureInfo'參數將字符串轉換爲DateTime?如果是這樣([link to technique](http://stackoverflow.com/questions/5590180/how-to-convert-a-datetime-string-to-a-current-culture-datetime-string)),那麼'd下面的''或'D'選項應該適合你。 – neontapir

+1

我不這麼認爲。應該很容易做到這一點...找到第一個H或H,回到一個空間,你已經得到它。 –

回答

1

如果框架自動提供了類似的東西,我會感到驚訝。我似乎無法找到任何關於此事的信息。

如果您提供給用戶的日期時間格式列表在您的控制之下(即您不允許自由格式的格式),則一種選擇是將普通格式字符串的查找表創建爲無時間部分如下:

var mapping = new Dictionary<string, string>() { 
    { "dddd, MMMM d, yyyy h:mm tt", "dddd, MMMM d, yyyy" }, 
    { "dddd, MMMM d, yyyy hh:mm tt", "dddd, MMMM d, yyyy" }, 
    ... 
}; 

單調乏味,但極其簡單,取決於您允許的格式數量。

或者,您可以選擇創建一個簡單的函數,它試圖從格式字符串中刪除時間組件。根據你的目標,這可能是一個有效的選擇。日期時間格式字符串被設計爲具有文化適應性,如果不是嚴格正確的話。

或者,您也可以簡單地要求您的用戶爲日期字符串選擇格式。