2013-02-13 36 views
8

我不明白爲什麼在DateTime.ParseExact中有IFormatProvider的重載?CultureInfo on DateTime.ParseExact?

如果我定義正是應該如何解析(空間,隔板等),那麼孤單應該沒問題:

所有這些3個示例顯示了同樣的結果:

例1

CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US"); 
var t= DateTime.ParseExact("13-2-2013", "d-M-yyyy", provider, DateTimeStyles.None); 
Console.WriteLine (t); //13/02/2013 00:00:00 

例2

CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US"); 
    var t= DateTime.ParseExact("13/2/2013", "d/M/yyyy", provider, DateTimeStyles.None); 
    Console.WriteLine (t); //13/02/2013 00:00:00 

例如3

CultureInfo provider =CultureInfo.CreateSpecificCulture("en-US"); 
var t= DateTime.ParseExact("[email protected]@@[email protected]@@2013", "[email protected]@@[email protected]@@yyyy", provider, DateTimeStyles.None); 
Console.WriteLine (t); //13/02/2013 00:00:00 

那麼,爲什麼我需要提供供應商如果我明確界定結構?

回答

8

還有依賴於文化的格式說明符,如時間分隔符(:)和日期分隔符(/)。那些不符合特定的字符,而是文化中指定的分隔符。

+0

但我指定了哪些分隔符! (樣品:@@@) – 2013-02-13 10:04:57

+0

@羅伊,不是。你必須在單引號中加上'/'字符來實現這一點。您的第二個示例當前使用文化日期分隔符分析日期。 – 2013-02-13 10:05:58

+0

@RoyiNamir:如果你使用'-',那麼這是一個文字字符,但是如果你使用'/',那麼它就是日期分隔符說明符,這是不同的文字。例如,使用瑞典的cutlure,日期分隔符是'-'字符。 – Guffa 2013-02-13 10:06:50

1

因爲:

  1. 指定的格式可以包括局部工作日和月的名稱。
  2. 字符格式字符串並不代表字面字符而是作爲由格式提供者指定的隔膜:/(見表here的底部)。
+0

所以我的例子是純粹的日期 - 這是不需要的...對嗎? – 2013-02-13 10:04:19

+0

@RoyiNamir:不,正斜槓也代表了針對文化的分隔符。你需要用'/'來指定文字斜線。 – Jon 2013-02-13 10:06:50

+0

你能提供一個會破壞我的樣本的例子嗎? – 2013-02-13 10:08:17

1

我可以主要想象一個Web應用程序,也可能是一個表單,客戶機將信息提交給服務器。此表單還包含日期選擇器,並根據特定文化發送選定日期。所以如果在美國使用的網站,他們發送13/2/2013,而來自德國你得到13.2.2013。那麼如何在服務器端代碼中處理日期呢?

你可以在ASP.NET MVC使用sometheing這樣(感謝謝爾蓋,Get CultureInfo from current visitor and setting resources based on that?):

var userLanguages = Request.UserLanguages; 
CultureInfo ci; 
if (userLanguages.Count > 0) 
{ 
    try 
    { 
     ci = new CultureInfo(userlanguages[0]); 
    } 
    catch(CultureNotFoundException) 
    { 
     ci = CultureInfo.InvariantCulture; 
    } 
} 
else 
{ 
    ci = CultureInfo.InvariantCulture; 
} 

,然後解析爲datetime:

var t = DateTime.ParseExact(formDateString, "d/M/yyyy", ci, DateTimeStyles.None); 
+0

以及如果用戶輸入'2/13/2013'會怎麼樣?我必須將模式從''d/M/yyyy'''改變爲'M/d/yyyy'這就是我的問題。**確實解析只適用於我確切知道M || d || yyyy位置?** – 2013-02-17 08:29:31

+0

不,因爲您沒有創建簡單的文本框,但是是一個日期選擇器,用戶可以在其中交互地選擇日期,並且控件根據用戶的文化顯示選定的日期。然後在一個按鈕上單擊您向服務器發送請求,在該服務器上將日期作爲簡單字符串發送。是的,在ParseExact中,你應該明確地告訴Parse的格式,這是一種更靈活的方式將字符串轉換爲datetime。 – tungi52 2013-02-17 08:53:19

+0

但是如果datepicker總是用'/'顯示(因爲我在JS中告訴過它)?爲什麼我需要申報文化? – 2013-02-17 10:47:17