2012-02-21 123 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;