我不明白为什么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
那么,如果我显式地定义结构,为什么我需要提供提供者呢?
仍然存在依赖于区域性的格式说明符,如时间分隔符(:)和日期分隔符(/)。这些字符与特定字符不匹配,但与区域性中指定的分隔符不匹配。
因为:
- 指定的格式可以包括工作日和月份的本地化名称
- 格式字符串中的字符
:
和/
并不表示文字字符,而是格式提供程序指定的分隔符(请参阅此处的表底部)
我主要可以想象一个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);