当文化改变时,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.ParseExactDateTime.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)

C#报错:at System.Convert.ToDateTime(String value)

日期循环