查找最近的时间跨度

时间:2018-09-13 16:08:44

标签: algorithm date datetime openstack

我有一个要求,我要说两个参数bucketDelta和一个开始时间,我需要以bucketDelta步长计算小于给定时间的最近时间间隔。 (声音很复杂?这是一个例子)

say 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 PM-9月13日12:00返回 ..

这是我的逻辑,但是我对一百万个Ifs不太满意。有更好的方法吗?

            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 :(得分:1)

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

例如,在Java中,您的计算可能类似于以下内容(未经测试):

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