我想计算“下一个”半小时或小时的剩余分钟数。
假设我得到一个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
类
答案 0 :(得分:10)
将模数运算符%
与30一起使用。您的结果将等于(60 - currentMinutes) % 30
。关于它用于集合的LINQ
,所以我无法真正了解它如何在您的案例中使用。
答案 1 :(得分:3)
var minutesToNextHalfHour = (60 - yourDateTimeVariable.Minutes) % 30;
答案 2 :(得分: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;
答案 3 :(得分:2)
这应该这样做:
int remainingMinutes = (current.Minute >= 30)
? 60 - current.Minute
: 30 - current.Minute;
答案 4 :(得分:1)
var hhmm = fromTimeString.Split(':');
var mins = int.Parse(hhmm[1]);
var remainingMins = (60 - mins) % 30;
答案 5 :(得分: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;
答案 6 :(得分:1)
我会使用modulo + 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();
}