Как рассчитать оставшиеся минуты до «следующих» получаса или часа? - PullRequest
2 голосов
/ 21 февраля 2012

Я хотел бы посчитать оставшиеся минуты до «следующих» получаса или часа.

Скажите, я получаю строку времени начала 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 классом

Ответы [ 7 ]

10 голосов
/ 21 февраля 2012

Используйте оператор по модулю % с 30. Ваш результат будет равен (60 - currentMinutes) % 30.Около LINQ он используется для коллекций, поэтому я не могу понять, как его можно использовать в вашем случае.

3 голосов
/ 21 февраля 2012

Вы можете использовать этот 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 голосов
/ 21 февраля 2012
var minutesToNextHalfHour = (60 - yourDateTimeVariable.Minutes) % 30;
2 голосов
/ 21 февраля 2012

Это должно сделать это:

int remainingMinutes = (current.Minute >= 30)
    ? 60 - current.Minute
    : 30 - current.Minute;
1 голос
/ 21 февраля 2012

Я бы использовал по модулю + 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();
}
1 голос
/ 21 февраля 2012
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 голос
/ 21 февраля 2012
var hhmm = fromTimeString.Split(':');
var mins = int.Parse(hhmm[1]);
var remainingMins = (60 - mins) % 30;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...