我不明白为什么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
那么为什么我需要提供提供者?如果我明确定义结构?
答案 0 :(得分:8)
仍然存在依赖于文化的格式说明符,例如时间分隔符(:)和日期分隔符(/)。这些与特定字符不匹配,但与文化中指定的分隔符匹配。
答案 1 :(得分:1)
由于:
:
和/
不代表 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);