我有一个要求,我要说两个参数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);
答案 0 :(得分:1)
将两者都转换为标准单位的整数倍,将绝对时间除以存储桶的长度,使用floor
得到一个整数,乘以存储桶的长度,然后转换回去。根据您的语言,floor
可能是类型系统中的隐式或显式。
例如,在Java中,您的计算可能类似于以下内容(未经测试):
long intervals = originalInstant.toEpochMilli() / bucketInMilliseconds;
Instant answer = Instant.fromEpochMilli( bucketInMilliseconds * intervals );