2012-02-21 122 views
2

我想計算剩下的幾分鐘到「下一個」半小時或一小時。如何計算剩餘分鐘數到「下一個」半小時或一小時?

說我得到一個07:15的開始時間字符串,我希望它計算剩餘的分鐘到最近的半小時(07:30)

That would be 15min. 

然後,我也能有這樣的情況:開始時間可以07:45,我想它來計算剩餘分鐘到最近的小時(08:00)

That would also be 15min. 

所以任何字符串不到30分鐘的時間將計算至最接近的半小時(..:30),並在30分鐘內的任何字符串將計算到最接近的小時(..:00)

我不想做一堆if語句,因爲我從時間字符串中獲得可以從一小時開始分鐘。

這是我做不想做的事:

if (int.Parse(fromTimeString.Right(2)) < 30) 
{ 
    //Do Calculation 
} 
else 
{ 
    //Do Calculation 
} 

public static string Right(this String stringValue, int noOfCharacters) 
{ 
    string result = null; 

    if (stringValue.Length >= noOfCharacters) 
    { 
     result = stringValue.Substring(stringValue.Length - noOfCharacters,  noOfCharacters); 
    } 
    else 
    { 
     result = ""; 
    } 

    return result; 
} 

不正是linq或與DateTime

+2

你真的是指「最接近」,還是你的意思是「下一個」?在你的大部分例子中,你似乎正在計算直到*下一個*半小時的剩餘時間量。這不一定是最近的一個,因爲這可能是在較早的時間。 – 2012-02-21 09:11:23

+0

@MarkByers對不起,我的意思是「下一個」。 – Willem 2012-02-21 09:12:39

+0

如果輸入爲「08:30」,輸出應爲「30」還是「0」? – 2012-02-21 09:15:25

回答

10

使用模運算%與30你的結果更簡單的方法將等於到(60 - currentMinutes) % 30。關於LINQ它用於收藏,所以我不能真正看到它如何在你的情況下使用。

3
var minutesToNextHalfHour = (60 - yourDateTimeVariable.Minutes) % 30; 
+0

當'分鐘= 0'或'分鐘= 30'時,這將返回30。 – 2012-02-21 10:05:11

+0

謝謝。更新了答案 – Maheep 2012-02-21 10:09:17

+1

如果考慮秒數,則小時邊界不正確。例如11:00:25,這將返回11:00:00而不是11:30:00。 – Hemant 2013-07-31 08:21:49

1
var hhmm = fromTimeString.Split(':'); 
var mins = int.Parse(hhmm[1]); 
var remainingMins = (60 - mins) % 30; 
2

這應做到:

int remainingMinutes = (current.Minute >= 30) 
    ? 60 - current.Minute 
    : 30 - current.Minute; 
+0

對於8:00結果將是30和8:30將是0.你可能想要使用'> =' – 2012-02-21 09:35:42

+0

@Piotr:好評,thx! – 2012-02-21 09:59:47

1
var str = "7:16"; 
var datetime = DateTime.ParseExact(str, "h:mm", new CultureInfo("en-US")); 
var minutesPastHalfHour = datetime.Minute % 30; 
var minutesBeforeHalfHour = 30 - minutesPastHalfHour; 
1

我會用模+ TimeSpan.TryParse

public static int ComputeTime(string time) 
{ 
    TimeSpan ts; 

    if (TimeSpan.TryParse(time, out ts)) 
    { 
     return (60 - ts.Minutes) % 30; 
    } 

    throw new ArgumentException("Time is not valid", "time"); 
} 

private static void Main(string[] args) 
{ 
    string test1 = "7:27"; 
    string test2 = "7:42"; 

    Console.WriteLine(ComputeTime(test1)); 
    Console.WriteLine(ComputeTime(test2)); 

    Console.ReadLine(); 
} 
3

您可以使用此DateTime蜱全面的方法來獲得直到下半場的時間你的:

var minutes = 30; 
var now = DateTime.Now; 
var ticksMin = TimeSpan.FromMinutes(minutes).Ticks; 
DateTime rounded = new DateTime(((now.Ticks + (ticksMin/2))/ticksMin) * ticksMin); 
var diff=rounded-now; 
var minUntilNext = diff.TotalMinutes > 0 ? diff.TotalMinutes : minutes + diff.TotalMinutes;