2017-05-12 65 views
-3

我需要對C#中的操作和剩餘時間進行計算。 我保存在HH的字符串格式操作的開始:MM:SS使用C#中的DateTime和TimeSpan進行計算

我有默認的操作時間長度HH的字符串格式:MM:SS

現在我想計算:

  • 剩餘時間/額外的時間:例如,如果該操作仍是缺省長度的下方,它應該顯示-HH:MM:SS,並且如果該操作花費的時間超過預設時間,它應該顯示+ HH:MM:SS
  • 如果操作時間較長,我還想要一個雙HH的值,MM的百分比風格。例如:3小時和30分鐘應顯示爲3,5

兩個結果都要彼此相鄰顯示。 我知道我必須將字符串值轉換爲DateTime和/或TimeSpan值來進行計算,但是目前我不知道如何計算,因爲例如第一個操作不會給我一個負值,但只是回到時間上[昨天22:30:00]。

+0

節省估價爲'DateTime',但計算導致'TimeSpan's,如名稱所暗示的。爲什麼你把時間保持爲'string',只是讓它保留'DateTime'而不是一直轉換? – slawekwin

+0

我從外部網頁獲取值,所以這些值首先作爲字符串進入程序。 – Kai

回答

1

試試這個..

var start = "17:05:11"; // Pass this as a parameter 
var startTime = DateTime.Parse(start); 

var defaultDuration = TimeSpan.FromMinutes(2); 
TimeSpan operationDuration = startTime - DateTime.Now; 

TimeSpan diff = defaultDuration - operationDuration; 

if (operationDuration > defaultDuration) 
{ 
    Console.Out.WriteLine($"+{diff.Hours}:{diff.Minutes}:{diff.Seconds}"); 
} 
else 
{ 
    Console.Out.WriteLine($"-{diff.Hours}:{diff.Minutes}:{diff.Seconds}"); 
    Console.Out.WriteLine($"{diff.Hours},{Math.Round(((double)(diff.Minutes * 100/60)),0, MidpointRounding.AwayFromZero)}");//example: 3hours and 30 minutes should be displayed as 3,5 
} 
+0

我不得不適應一些小的事物[TimeSpan.FromMinutes()],但一般來說你提出的解決方案是有效的。非常感謝! – Kai

1

起初將默認時間保存爲TimeSpan。然後,您可以採取DateTime.Now並在操作開始時保存它。採取另一個DateTime.Now稍後它完成時。在此之後,您可以計算當前操作的TimeSpan。然後你可以計算出這兩個TimeSpans作爲另一個TimeSpan的差異。它可以是積極的或消極的,有了這些價值觀,你可以做任何你想做的事情。

TimeSpan defaultDuration = new TimeSpan(3, 30, 0); 
DateTime begin = DateTime.Now; 

//Do some work 

DateTime end = DateTime.Now; 
TimeSpan thisDuration = end - begin; 
Console.WriteLine("Default: " + defaultDuration.ToString("hh\\:mm\\:ss")); 
Console.WriteLine("This time: " + thisDuration.ToString("hh\\:mm\\:ss")); 
Console.Write("Difference: "); 
if (thisDuration > defaultDuration) 
    Console.Write("-"); 
Console.WriteLine((thisDuration - defaultDuration).ToString("hh\\:mm\\:ss")); 
+0

感謝您的建議,但我不能像這樣使用「開始」。我以字符串的形式從外部網頁獲取值。 – Kai

+3

@kai搜索DateTime.Parse – Mark