CultureInfo on DateTime.ParseExact?



我不明白为什么DateTime.ParseExact中的IFormatProvider过载?

如果我准确地定义它应该如何解析(空格、分隔符等),那么应该没有问题:

所有这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

那么,如果我显式地定义结构,为什么我需要提供提供者呢?

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

因为:

  1. 指定的格式可以包括工作日和月份的本地化名称
  2. 格式字符串中的字符:/并不表示文字字符,而是格式提供程序指定的分隔符(请参阅此处的表底部)

我主要可以想象一个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);  

相关内容

  • 没有找到相关文章

最新更新