我从第三方获得了要转换为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
DateTime.ParseExact()
时,字符串拆分的使用不是关键因素此外,如果您真的认为效率如此重要,请不要假设对DateTime.ParseExact的任何单个调用都是“快速的”,否则您所做的任何字符串拆分都将成为瓶颈。
答案 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
组具有相同的值(例如所有0
或123
),则此方法有效。
Tbh,我不明白您为什么认为fff:ffffff:fffffffff
与000: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小提琴:
答案 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)
似乎有用