Найдите ближайший временной интервал

У меня есть требование, когда у меня есть два параметра: bucketDelta и время начала, и мне нужно рассчитать ближайший временной интервал в шагах bucketDelta, который меньше заданного времени. (звучит достаточно запутанно? Вот пример)

скажи bucketDelta 15 минут, а мое время 13 сентября 19:05 - возвращается 13 сентября 19:00. 15 минут, а мое время - 13 сентября, 19:17 - возвращается 13 сентября, 19:15. 15 минут, а мое время 13 сентября 19:35 - возвращается 13 сентября 19:30. ...

30 минут, а мое время 13 сентября 19:05 - возвращается 13 сентября 19:00. 30 минут, а мое время - 13 сентября, 19:17 - возвращается 13 сентября, 19:00. 30 минут, а мое время 13 сентября 19:35 - возвращается 13 сентября 19:30.

...

60 минут, мое время 13 сентября 19:05 - возвращается 13 сентября 19:00. 60 минут, а мое время 13 сентября 19:35 - возвращается 13 сентября 19:00. 60 минут, мое время - 13 сентября, 19:55 - возвращается 13 сентября, 19:00.

24 часа, мое время 13 сентября 19:05 - возвращается 13 сентября 12:00. 24 часа, мое время 13 сентября, 21:05 - возвращается 13 сентября, 00:00. ..

Вот моя логика, но я не очень доволен миллионом «если». Есть лучший способ сделать это ?

            if (bucketDelta == TimeSpan.FromSeconds(900)) {
            if (bucketStop.Minute > 0 && bucketStop.Minute < 15)
            {
                minute = bucketStop.Minute;
            }
            else if (bucketStop.Minute > 15 && bucketStop.Minute < 30)
            {
                minute = bucketStop.Minute - 15;
            }
            else if (bucketStop.Minute > 30 && bucketStop.Minute < 45)
            {
                minute = bucketStop.Minute - 30;
            }
            else if (bucketStop.Minute > 45 && bucketStop.Minute < 60)
            {
                minute = bucketStop.Minute - 45;
            }
        }else if(bucketDelta == TimeSpan.FromSeconds(1800)) {
            if (bucketStop.Minute > 0 && bucketStop.Minute < 30)
            {
                minute = bucketStop.Minute;
            }
            else if (bucketStop.Minute > 30 && bucketStop.Minute < 60)
            {
                minute = bucketStop.Minute - 30;
            }
        } else if(bucketDelta == TimeSpan.FromSeconds(3600))
        {
            if (bucketStop.Minute > 0 && bucketStop.Minute < 60)
            {
                minute = bucketStop.Minute;
            }
        }
        else if (bucketDelta == TimeSpan.FromSeconds(86400))
        {
            if (bucketStop.Hour > 0 && bucketStop.Hour < 24)
            {
                minute = (bucketStop.Hour * 60);
            }
        }
        bucketStop = bucketStop.AddMinutes(-1 * minute);

что вы подразумеваете под дельта-шагами сегмента? 15minutes and my time is 13 Sep 7:05 PM - returns 13 Sep 7:00 PM что это значит, разница 5 минут, как получается 5 минут из 15 минутного шага? пожалуйста, объясни

guroosh 13.09.2018 20:20

также, если он в java, добавьте тег java

guroosh 13.09.2018 20:28
0
2
54
1

Ответы 1

Преобразуйте оба значения в целые числа, кратные стандартной единице, разделите абсолютное время на длину вашего сегмента, используйте floor для получения целого числа, умножьте на длину вашего сегмента и преобразуйте обратно. В зависимости от вашего языка floor может быть явным или неявным из системы типов.

Например, в Java ваш расчет может выглядеть примерно так (не проверено):

long intervals = originalInstant.toEpochMilli() / bucketInMilliseconds;
Instant answer = Instant.fromEpochMilli( bucketInMilliseconds * intervals );

Другие вопросы по теме