2013-02-13 46 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