У меня есть требование, когда у меня есть два параметра: 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);
также, если он в java, добавьте тег java
Преобразуйте оба значения в целые числа, кратные стандартной единице, разделите абсолютное время на длину вашего сегмента, используйте floor
для получения целого числа, умножьте на длину вашего сегмента и преобразуйте обратно. В зависимости от вашего языка floor
может быть явным или неявным из системы типов.
Например, в Java ваш расчет может выглядеть примерно так (не проверено):
long intervals = originalInstant.toEpochMilli() / bucketInMilliseconds;
Instant answer = Instant.fromEpochMilli( bucketInMilliseconds * intervals );
что вы подразумеваете под дельта-шагами сегмента?
15minutes and my time is 13 Sep 7:05 PM - returns 13 Sep 7:00 PM
что это значит, разница 5 минут, как получается 5 минут из 15 минутного шага? пожалуйста, объясни