Ticks是一个周期,存储的是一百纳秒,换算为秒,一千万分之一秒。
我们需要计算2个时间之间,经过多少Ticks,可以使用下面的方法来实现,使用2个时间相减。
得到结果为正数,是使用较晚的时间减去较早的时间。反之为负数,即是使用较早的时间减去较晚的时间。
创建一个对象:
class Ag { private DateTime _StartDate; public DateTime StartDate { get { return _StartDate; } set { _StartDate = value; } } private DateTime _EndDate; public DateTime EndDate { get { return _EndDate; } set { _EndDate = value; } } public Ag(DateTime startDate, DateTime endDate) { this._StartDate = startDate; this._EndDate = endDate; } public void DurationTicks() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine(ts.Ticks); } }
Source Code
在控制台应用程序运行上面写好的程序:
现在来了,实际情况并非都是计算2个时间之间的Ticks,而是有可能需要计算2个时间之间的秒,分钟,小时,天等。
为了实现上面的要求,我们得了解一些基础知识:
1天= 24;
1小时= 60分钟;
1分钟= 60秒;
1秒= 10000000Ticks;
因此,根据上面的计算结果(Ticks)和公式可以计算出2个时间之间的秒,分钟,小时,天等。
我们在类别中,添加下面4个方法:
public void DurationSeconds() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Seconds: {0}", ts.Ticks / 10000000L); } public void DurationMinutes() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Minutes: {0}",ts.Ticks / (10000000L * 60)); } public void DurationHours() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Hours: {0}", ts.Ticks / (10000000L * 60 * 60)); } public void DurationDays() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Days: {0}", ts.Ticks / (10000000L * 60 * 60 * 24)); }
Source Code
方法写完,在控制台测试一下上面的方法:
上面的计算方法有点原始,MSDN已经给出相应的方法,就可以计算出2个时间之间的秒,分钟,小时,天等。如:
TotalSeconds(),TotalMinutes(),TotalHours(),TotalDays();
为了演示与测试,Insus.NET再创建另外4个方法:
public void TotalSeconds() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Seconds: {0}", ts.TotalSeconds); } public void TotalMinutes() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Minutes: {0}", ts.TotalMinutes); } public void TotalHours() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Hours: {0}", ts.TotalHours); } public void TotalDays() { TimeSpan ts = (_EndDate - _StartDate).Duration(); Console.WriteLine("Duraction Days: {0}", ts.TotalDays); }
Source Code
再运行程序:
最后的现成的方法,它已经封装好单位转换与公式计算。
细心的用户有可以发现,2种结果有些不相同,没有小数和有小数。其实可以解决的,把一千万分之一秒这个基数转换为double数据类型即可。也就是说把能来的L-->D:
public void DurationSeconds() { TimeSpan ts = (_EndDate - _StartDate).Duration(); // Console.WriteLine("Duraction Seconds: {0}", ts.Ticks / 10000000L); Console.WriteLine("Duraction Seconds: {0}", ts.Ticks / 10000000D); } public void DurationMinutes() { TimeSpan ts = (_EndDate - _StartDate).Duration(); // Console.WriteLine("Duraction Minutes: {0}", ts.Ticks / (10000000L * 60)); Console.WriteLine("Duraction Minutes: {0}", ts.Ticks / (10000000D * 60)); } public void DurationHours() { TimeSpan ts = (_EndDate - _StartDate).Duration(); // Console.WriteLine("Duraction Hours: {0}", ts.Ticks / (10000000L * 60 * 60)); Console.WriteLine("Duraction Hours: {0}", ts.Ticks / (10000000D * 60 * 60)); } public void DurationDays() { TimeSpan ts = (_EndDate - _StartDate).Duration(); // Console.WriteLine("Duraction Days: {0}", ts.Ticks / (10000000L * 60 * 60 * 24)); Console.WriteLine("Duraction Days: {0}", ts.Ticks / (10000000D * 60 * 60 * 24)); }
Source Code
这次,我们再次运行程序,看看结果是否与自带的方法计算的结果相同:
OK,就这样子,你可以使用自带现成的方法,可以自己写。
写到这里应该是结果了,但是回过头来看看自己写的代码,有一句:
TimeSpan ts = (_EndDate - _StartDate).Duration();
每一个方法里均有,代码冗余了,我们可以简化它,写一个方法或是属性:
public TimeSpan Ts { get { return (_EndDate - _StartDate).Duration(); } } public long Ticks { get { return Ts.Ticks; } }
Source Code
经过一次重构,8个方法里,只需要一句代码就行了: