C#DateTime.Parse /小时/分钟/秒/米/微秒/纳秒有效地解析时间

时间:2018-11-13 11:57:51

标签: c# datetime datetime-format

我从第三方获得了要转换为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);

原因:

  • 我不能保证date字符串的结构,因为它来自第三方。因此,使用格式模式dd MMM yyyy HH:mm:ss:fff:fff:fff
  • 是非常危险的
  • 正如@Jeroen Mostert所写,当您使用DateTime.ParseExact()时,字符串拆分的使用不是关键因素
  

此外,如果您真的认为效率如此重要,请不要假设对DateTime.ParseExact的任何单个调用都是“快速的”,否则您所做的任何字符串拆分都将成为瓶颈。

3 个答案:

答案 0 :(得分:3)

嗯,这不就是这个吗?

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),则此方法有效。

Tbh,我不明白您为什么认为fff:ffffff:fffffffff000:000:000相匹配

  

出于我的业务需要,我不需要微秒级的时间。

您可以通过切除微/纳米部分来使第二种格式起作用:

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来记录无效值并继续下一个值。

答案 1 :(得分:1)

没有确切答案

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

注意事项:输入字符串(000)的数量应与format(fff)相匹配,

000 =效果很好

00 = fff不好

000 = ff不好

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

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

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

.NET小提琴:

https://dotnetfiddle.net/5UxCkd

答案 2 :(得分:0)

我认为: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示例代码