簡體   English   中英

C#DateTime.Parse /小時/分鍾/秒/米/微秒/納秒有效地解析時間

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

從第三方,我得到了要轉換為DateTime的字符串: “ 13 NOV 2018 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的任何單個調用都是“快速的”,否則您所做的任何字符串拆分都將成為瓶頸。

好吧,這不就是這個嗎?

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: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才能記錄無效值並繼續下一個值。

沒有確切答案

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/zh-cn/dotnet/standard/base-types/custom-date-and-time-format-strings

.NET小提琴:

https://dotnetfiddle.net/5UxCkd

我認為: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示例代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM