DateTime.ParseExact上的CultureInfo?

时间:2013-02-13 10:01:35

标签: c# .net datetime

我不明白为什么DateTime.ParseExact中的IFormatProvider存在重载?

如果我正在定义完全应该如何解析它(空格,分隔符等),那么这应该没有问题:

所有这三个例子都显示了相同的结果:

示例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("13@@@2@@@2013", "d@@@M@@@yyyy", provider, DateTimeStyles.None);  
 Console.WriteLine (t); //13/02/2013 00:00:00

那么为什么我需要提供提供者?如果我明确定义结构?

3 个答案:

答案 0 :(得分:8)

仍然存在依赖于文化的格式说明符,例如时间分隔符(:)和日期分隔符(/)。这些与特定字符不匹配,但与文化中指定的分隔符匹配。

答案 1 :(得分:1)

由于:

  1. 指定的格式可以包含工作日和月份的本地化名称。
  2. 格式字符串中的字符:/不代表 literal 字符,而是格式提供程序指定的分隔符(请参阅表格底部{ {3}})。

答案 2 :(得分:1)

我可以想象一个Web应用程序,也许是一个表单,客户端将信息提交给服务器。此表单还包含一个日期选择器,并根据特定的文化发送所选日期。因此,如果在美国使用的网站,他们发送13/2/2013,而来自德国,你得到13.2.2013。那你如何处理服务器端代码中的日期呢?

你可以在ASP.NET MVC中使用这样的东西(感谢Sergey,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);