当文化改变时,Convert.ToDateTime 运行缓慢
Posted
技术标签:
【中文标题】当文化改变时,Convert.ToDateTime 运行缓慢【英文标题】:Convert.ToDateTime runs slow when culture changed 【发布时间】:2016-09-28 08:54:49 【问题描述】:我在我的 PC 中将文化更改为波斯语,之后我的应用程序加载数据库速度变慢了大约五倍,因为这条线:
Convert.ToDateTime(someString)
什么问题?我应该怎么做才能解决它?
UPD1:字符串示例2010-08-03 00:00:00.000
UPD2:我使用以下代码进行测量:
string s = "2010-08-03 00:00:00.000";
DateTime start = DateTime.Now;
int n = (int)5e6;
for (int i = 0; i < n; i++)
DateTime date = Convert.ToDateTime(s);
DateTime finish = DateTime.Now;
Console.WriteLine(finish - start);
Console.ReadKey();
在默认(AD)日历中:(~5 秒)
00:05:48
当我在 Windows 10 中将日历更改为波斯语时:(~4 分钟)
03:51:73
【问题讨论】:
你如何改变文化? @RahulHendawe 在控制面板中。不在我的代码中! “someString”是什么。举个例子。您要将波斯日期转换为 AD 还是什么? @Stranger 更新了问题。不,我只想在 AD 中加载日期时间,但在波斯语的图表中显示。 试试这个 DateTime myDate = DateTime.Parse(dateString); 【参考方案1】:它没有记录,所以这在任何时候都可能是错误的,但我猜 DateTime.Parse(或 Convert.ToDateTime)会尝试所有可用的格式(在当前文化中)来解析字符串。它只是从与您的字符串不匹配的格式开始。因此,在找到正确的一个之前,几次失败。这导致完成该过程的时间更长。
为了获得精确(大致)相同的性能,我建议使用DateTime.ParseExact
或DateTime.TryParseExact
并指定Culture Invariant 格式。例如:
string s = "2010-08-03 00:00:00.000";
string format = "yyyy-MM-dd HH:mm:ss.fff";
DateTime date = DateTime.ParseExact(s, format, CultureInfo.InvariantCulture);
参考:Is DateTime.ParseExact() faster than DateTime.Parse()。但请注意,接受的答案不正确。
【讨论】:
更快?是5分3小时之前吧?那么,更好吗? 不,它是在大约 5 秒和 3 分钟之前,您的解决方案在大约 4 秒内,所以它更好。谢谢以上是关于当文化改变时,Convert.ToDateTime 运行缓慢的主要内容,如果未能解决你的问题,请参考以下文章
DateTime.Parse 和 Convert.ToDateTime 之间有啥区别?
今天发现一个Convert.ToDateTime的异常,算不算微软的bug呢?
C#报错:at System.Convert.ToDateTime(String value)
C#报错:at System.Convert.ToDateTime(String value)