Расчет в следующий раз и округление даты-времени - PullRequest
1 голос
/ 02 октября 2019

У меня есть дата, например, 2019-02-10 20:39:23, и я хочу округлить это время до следующего, кроме 15 минут, до ближайшего. Таким образом, это означает, что следующий должен быть 2019-02-10 21:45:00 или другой пример 21:24:17 должен стать 21:45:00 ... Приведенный ниже код работает нормально, пока у меня нет даты и времени, как 2019-02-10 23:54:20. Тогда следующий округленный должен быть 2019-03-10 00:00:00, но я получаю 2019-02-10 00:00:00.

Вот как я это делаю:

static void Main(string[] args)
{
    DateTime dt = DateTime.Parse("2019-02-10 23:54:23");

    var interval = TimeSpan.FromMinutes(15);

     DateTime last = NextTime(dt, interval);

     Console.WriteLine(last);

    }

    private static DateTime NextTime(DateTime value, TimeSpan interval)
    {
        var temp = value.Add(new TimeSpan(interval.Ticks / 2));
        var time = new TimeSpan((temp.TimeOfDay.Ticks / interval.Ticks) * interval.Ticks);

        return value.Date.Add(time);
    }

Для вывода я получаю 2019-02-10 00:00:00 вместо 2019-03-10 00:00:00

Не могу понять, почему не переходит на следующий день ...

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Возвращаемое значение вычисляется из неверной переменной. Используйте temp вместо value:

 private static DateTime NextTime(DateTime value, TimeSpan interval)
 {
     var temp = value.Add(new TimeSpan(interval.Ticks / 2));
     var time = new TimeSpan((temp.TimeOfDay.Ticks / interval.Ticks) * interval.Ticks);

     return temp.Date.Add(time);
 }

Причина этого в том, что вы добавляете интервал к значению. Если он переходит за полночь / конец дня, ваш value.Date вернет неправильный день. Так как вы храните temp, вы можете вернуть temp.Date.Add(time)

0 голосов
/ 02 октября 2019

Используя DateTime.Add (TimeSpan), время совпадает с датой.

Я изменил ваш код таким образом, и он добился цели:

    private static DateTime NextTime(DateTime value, TimeSpan interval)
    {
        var temp = value.Add(new TimeSpan(interval.Ticks / 2));
        var time = new TimeSpan((temp.TimeOfDay.Ticks / interval.Ticks) * interval.Ticks);
        if (time == new TimeSpan(0, 0, 0)) { time = new TimeSpan(24, 0,0); }
        var timeDiff = time - value.TimeOfDay;

        var finalDate = value.AddHours(timeDiff.Hours);
        finalDate = finalDate.AddMinutes(timeDiff.Minutes);
        finalDate = finalDate.AddSeconds(timeDiff.Seconds);

        return finalDate;
    }

Я считаю,это должно быть более красиво, но это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...