記一次在WPF中,在將格式為“DD.HH:mm:ss”字元串轉換成TimeSpan時遇到的坑 如果字元串為:DD.HH:mm:ss,轉換結果正確。例如: 以上輸出結果:轉換前:2.12:25:45.555轉換後:True 2.12:25:45.555 分別更改時間戳不同部分,使其超過對應的最大值。 ...
記一次在WPF中,在將格式為“DD.HH:mm:ss”字元串轉換成TimeSpan時遇到的坑
如果字元串為:DD.HH:mm:ss,轉換結果正確。例如:
1 var currentValue = "2.12:25:45.555"; 2 TimeSpan result; 3 var success = TimeSpan.TryParse(currentValue, out result); 4 Console.Write("轉換前:"+currentValue); 5 Console.WriteLine("轉換後:"+success + " "+ result.ToString());
以上輸出結果:轉換前:2.12:25:45.555轉換後:True 2.12:25:45.555
分別更改時間戳不同部分,使其超過對應的最大值。
- 更改天大於30:轉換前:30.12:25:45.555 轉換後:True 30.12:25:45.5550000
- 更改小時大於12:轉換前:2.23:25:45.555 轉換後:True 02.23:25:45.5550000
- 更改小時大於24:轉換前:2.25:25:45.555 轉換後:False 00:00:00 失敗
- 更改分鐘大於60:轉換前:2.12:75:45.555 轉換後:False 00.00:00:00 失敗
- 更改秒大於60:轉換前:2.12:25:75.555 轉換後:False 00.00:00:00 失敗
- 更改毫秒大於1000:轉換前:2.12:25:45.5555 轉換後:True 02.12:25:45.5550000 成功
問題:
對於毫秒數,我們知道1s=1000ms。當字元串中毫秒數超過1000時,會是什麼情況。
如上測試可以看出,在ToString()時,毫秒位數為7位。超過其範圍4位。最後四位是什麼含義呢?答案:最後四位為納秒有效數字位。(1ms=10000納秒)
圖1毫秒部分大於3位小於7位
如圖1所示。轉換前:2.12:25:45.125555 轉換後:True 2.12:25:45.1255550 ,毫秒125
圖2毫秒部分為7位
如圖2所示。轉換前:2.12:25:45.1255555 轉換後:True 2.12:25:45.1255555 ,毫秒125
圖3毫秒部分大於7位
如圖3所示。轉換前:2.12:25:45.125555555 轉換後:False 轉換失敗
總結:
- 字元串轉TimeSpan時對各部分值的設定有嚴格的限制,超過限制值,其並不會將相應部分向高位進位。(如小時部分為26,它不會轉換成一天2小時。
- 字元串毫秒部分在轉換時,它只截取前三位作為Milliseconds(毫秒)的有效部分,進行轉換,截取接下來的四位為TimeSpane中的納秒的值。即毫秒部分最多只能有7位,超過將轉換失敗(超限)。
- TimeSpan可以用@"dd\.hh\:mm\:ss\.fff"等進行字元串格式化。