Algorithm 找到最近的时间跨度

Algorithm 找到最近的时间跨度,algorithm,date,datetime,openstack,Algorithm,Date,Datetime,Openstack,我有一个要求,我有两个参数,一个bucketDelta和一个开始时间,我需要计算bucketDelta步长中小于给定时间的最近时间间隔。(听起来够复杂的吗?这里是一个例子) 说巴克特三角洲 15分钟,我的时间是9月13日下午7:05-返回9月13日下午7:00 15分钟,我的时间是9月13日下午7:17-返回9月13日下午7:15 15分钟,我的时间是9月13日下午7:35-返回9月13日下午7:30 30分钟,我的时间是9月13日下午7:05-返回9月13日下午7:00 30分钟,我的时间是

我有一个要求,我有两个参数,一个bucketDelta和一个开始时间,我需要计算bucketDelta步长中小于给定时间的最近时间间隔。(听起来够复杂的吗?这里是一个例子)

说巴克特三角洲 15分钟,我的时间是9月13日下午7:05-返回9月13日下午7:00 15分钟,我的时间是9月13日下午7:17-返回9月13日下午7:15 15分钟,我的时间是9月13日下午7:35-返回9月13日下午7:30

30分钟,我的时间是9月13日下午7:05-返回9月13日下午7:00 30分钟,我的时间是9月13日下午7:17-返回9月13日下午7:00 30分钟,我的时间是9月13日下午7:35-返回9月13日下午7:30

60分钟,我的时间是9月13日下午7:05-返回9月13日下午7:00 60分钟,我的时间是9月13日下午7:35-返回9月13日下午7:00 60分钟,我的时间是9月13日下午7:55-返回9月13日下午7:00

24小时,我的时间是9月13日下午7:05-返回9月13日上午12:00 24小时,我的时间是9月13日9:05下午-返回9月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);
if(bucketDelta==TimeSpan.FromSeconds(900)){
如果(bucketStop.Minute>0和&bucketStop.Minute<15)
{
分钟=bucketStop.分钟;
}
否则,如果(bucketStop.Minute>15和&bucketStop.Minute<30)
{
分钟=bucketStop。分钟-15;
}
否则,如果(bucketStop.Minute>30和&bucketStop.Minute<45)
{
分钟=bucketStop。分钟-30;
}
否则如果(bucketStop.Minute>45和&bucketStop.Minute<60)
{
分钟=bucketStop。分钟-45;
}
}否则如果(bucketDelta==时间跨度从秒(1800)){
如果(bucketStop.Minute>0和&bucketStop.Minute<30)
{
分钟=bucketStop.分钟;
}
否则如果(bucketStop.Minute>30和&bucketStop.Minute<60)
{
分钟=bucketStop。分钟-30;
}
}else if(bucketDelta==TimeSpan.FromSeconds(3600))
{
如果(bucketStop.Minute>0和&bucketStop.Minute<60)
{
分钟=bucketStop.分钟;
}
}
else if(bucketDelta==TimeSpan.FromSeconds(86400))
{
如果(bucketStop.Hour>0&&bucketStop.Hour<24)
{
分钟=(bucketStop.Hour*60);
}
}
bucketStop=bucketStop.AddMinutes(-1*分钟);

将两者转换为标准单位的整数倍,将绝对时间除以桶的长度,使用
floor
获得一个整数,乘以桶的长度,然后再转换回来。根据您的语言,
floor
可以是类型系统中的隐式,也可以是显式

例如,在Java中,您的计算可能如下所示(未经测试):


你所说的桶形三角形台阶是什么意思<代码>15分钟,我的时间是9月13日7:05下午-返回9月13日7:00下午这意味着什么,差异是5分钟,15分钟步骤如何得出5分钟?请解释如果是java,请添加java标记
long intervals = originalInstant.toEpochMilli() / bucketInMilliseconds;
Instant answer = Instant.fromEpochMilli( bucketInMilliseconds * intervals );