Ticks是一個周期,存儲的是一百納秒,換算為秒,一千萬分之一秒。我們需要計算2個時間之間,經過多少Ticks,可以使用下麵的方法來實現,使用2個時間相減。得到結果為正數,是使用較晚的時間減去較早的時間。反之為負數,即是使用較早的時間減去較晚的時間。創建一個對象: class Ag { privat ...
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個方法里,只需要一句代碼就行了: