10

我不明白为什么 IFormatProvider 中有过载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("13@@@2@@@2013", "d@@@M@@@yyyy", provider, DateTimeStyles.None);  
 Console.WriteLine (t); //13/02/2013 00:00:00

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

4

3 回答 3

9

仍然有一些依赖于文化的格式说明符,例如时间分隔符 (:) 和日期分隔符 (/)。那些不匹配特定字符,而是文化中指定的分隔符。

于 2013-02-13T10:04:11.327 回答
1

因为:

  1. 指定的格式可以包括工作日和月份的本地化名称。
  2. 格式字符串中的字符:/不代表文字字符,而是由格式提供程序指定的分隔符(请参见此处表格的底部)。
于 2013-02-13T10:03:35.727 回答
1

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

您可以在 ASP.NET MVC 中使用这样的东西(感谢 Sergey,从当前访问者那里获取 CultureInfo 并基于此设置资源?):

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;
}

然后解析为日期时间:

var t = DateTime.ParseExact(formDateString, "d/M/yyyy", ci, DateTimeStyles.None);  
于 2013-02-17T07:56:20.823 回答