WPF中TimeSpan的坑
程序员文章站
2022-07-01 23:18:45
记一次在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"等进行字符串格式化。