Найти ближайший промежуток времени - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть требование, где я говорю 2 параметра, 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 сентября в 9:05 - возвращение 13 сентября в 12: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);

1 Ответ

0 голосов
/ 13 сентября 2018

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

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

long intervals = originalInstant.toEpochMilli() / bucketInMilliseconds;
Instant answer = Instant.fromEpochMilli( bucketInMilliseconds * intervals );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...