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 []{':'})
之类的脏方法?
注:
- 出于我的业务需要,我不需要 micro/nano 秒的部分。
- 由于这个解析操作在一秒钟内发生多次,所以效率是一个关键因素。
更新
我选择了@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);
原因:
- 我不能保证
date
字符串的结构,因为它来自第三方。所以使用格式模式 dd MMM yyyy HH:mm:ss:fff:fff:fff
会很危险
- 正如@Jeroen Mostert 所写,当您使用
DateTime.ParseExact()
时,字符串拆分的用法并不是关键因素
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
的所有组都具有相同的值,例如所有 0
或 123
。
老实说,我不明白你为什么认为 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)
似乎有效
不是确切答案
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:
我从第三方获得了这个字符串,我想将其转换为 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 []{':'})
之类的脏方法?
注:
- 出于我的业务需要,我不需要 micro/nano 秒的部分。
- 由于这个解析操作在一秒钟内发生多次,所以效率是一个关键因素。
更新
我选择了@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);
原因:
- 我不能保证
date
字符串的结构,因为它来自第三方。所以使用格式模式dd MMM yyyy HH:mm:ss:fff:fff:fff
会很危险
- 正如@Jeroen Mostert 所写,当您使用
DateTime.ParseExact()
时,字符串拆分的用法并不是关键因素
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
的所有组都具有相同的值,例如所有 0
或 123
。
老实说,我不明白你为什么认为 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)
似乎有效
不是确切答案
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: