C# DateTime.Parse 高效计时 hour/min/sec/milis/micro/nano 秒

C# DateTime.Parse efficiently time with hour/min/sec/milis/micro/nano seconds

我从第三方获得了这个字符串,我想将其转换为 DateTime: “2018 年 11 月 13 日 16:08:52:000:000:000” 我试过这些选项,但 FormatException 抛出:

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000", 
                           "dd MMM yyyy HH:mm:ss:fff:ffffff:fffffffff", 
                                             CultureInfo.InvariantCulture)

当我使用这个时出现同样的异常:

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000",
                            "dd MMM yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture)

是否有一种干净的方法来按原样解析它,或者,我需要使用诸如 string.Split(new []{':'}) 之类的脏方法?

注:

更新

我选择了@Tim 的建议来进行字符串操作:

string date = "12 NOV 2018 16:08:52:000:000:000";
date = date.Remove(date.Remove(date.LastIndexOf(':')).LastIndexOf(':'));
DateTime result = System.DateTime.ParseExact(date, "dd MMM yyyy HH:mm:ss:fff", System.Globalization.CultureInfo.InvariantCulture);

原因:

Also, if you really think efficiency is so important, don't assume any single call to DateTime.ParseExact will be "fast", or that any string splitting you do will be a bottleneck.

嗯,不就是这样吗?

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000", 
                           "dd MMM yyyy HH:mm:ss:fff:fff:fff", 
                           System.Globalization.CultureInfo.InvariantCulture)

如果 f 的所有组都具有相同的值,例如所有 0123

老实说,我不明白你为什么认为 fff:ffffff:fffffffff 匹配 000:000:000

For my business needs, I don't need the part of micro/nano seconds.

您可以通过切断 micro/nano 部分使您的第二种格式工作:

string date = "12 NOV 2018 16:08:52:000:000:000";
date = date.Remove(date.Remove(date.LastIndexOf(':')).LastIndexOf(':'));
DateTime result = System.DateTime.ParseExact(date, "dd MMM yyyy HH:mm:ss:fff", System.Globalization.CultureInfo.InvariantCulture);

当然,这是假设总是至少有两个冒号。很明显,您需要 try-catch 来记录无效值并继续下一个值。

我认为 :fff 具有相同的格式是这里的关键因素

System.DateTime.ParseExact("12 NOV 2018 16:08:52:000:000:000","dd MMM yyyy H:mm:ss:fff:fff:fff", CultureInfo.InvariantCulture) 似乎有效

https://dotnetfiddle.net/ZAtchu 示例代码

不是确切答案

System.DateTime.ParseExact("25 NOV 2018 16:08:52:000:000:000",
                            "dd MMM yyyy HH:mm:ss:fff:fff:fff", CultureInfo.InvariantCulture);

需要考虑的事项:输入字符串 (000) 的计数应与格式 (fff) 匹配,

000 = fff 好

00 = fff 不好

000 = ff 不好

您可能需要在尝试解析之前操作输入日期字符串。

有关使用格式说明符 (fff) 的更多信息,请参阅此内容

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

.NET Fiddle:

https://dotnetfiddle.net/5UxCkd