C# 获取时间戳的时段结束时间?(向上取整)
我试图创建一个函数,返回给定分辨率的时间戳的句点结束日期时间。例如,如果分辨率为10分钟(存储为时间跨度),我的时间戳为2012-08-14 12:34,则时段结束时间为2012-08-14 12:40。下面的其他例子C# 获取时间戳的时段结束时间?(向上取整),c#,datetime,rounding,C#,Datetime,Rounding,我试图创建一个函数,返回给定分辨率的时间戳的句点结束日期时间。例如,如果分辨率为10分钟(存储为时间跨度),我的时间戳为2012-08-14 12:34,则时段结束时间为2012-08-14 12:40。下面的其他例子 Timestamp: 2012-08-14 1:15; Resolution: 01:00:00; Result: 2012-08-14 2:00 Timestamp: 2012-08-14 11:59; Resolution: 00:10:00; Result: 2012-08
Timestamp: 2012-08-14 1:15; Resolution: 01:00:00; Result: 2012-08-14 2:00
Timestamp: 2012-08-14 11:59; Resolution: 00:10:00; Result: 2012-08-14 12:00
Timestamp: 2012-08-14 12:00; Resolution: 00:10:00; Result: 2012-08-14 12:00
Timestamp: 2012-08-14 12:01; Resolution: 00:10:00; Result: 2012-08-14 12:10
我试图遵循(为t-sql编写)但在支持15分钟、60分钟和1天的决议时遇到了麻烦
您知道如何创建一个能够支持这些多个(由运行时确定的)解决方案的动态解决方案吗
编辑
这就是我到目前为止所做的,只要你的分辨率小于60分钟,它就可以工作,但是一旦你的分辨率为1小时,你就可以将分钟除以零,得到一个异常
public static DateTime ConvertToPeriodEndingTimestamp(TimeSpan resolution, DateTime timestamp)
{
var modifiedDate = new DateTime();
var baseDate = new DateTime(2008, 01, 01, 00, 00, 00);
var cursor = baseDate;
var nowToBaseDateDifference = timestamp.Subtract(baseDate).TotalMinutes;
//SET @Result = DATEADD(MINUTE, (resolution.TotalMinutes * (nowtoBaseDateDifference / resolution.TotalMinutes)) + resolution.TotalMinutes, '20000101')
modifiedDate =
baseDate.AddMinutes(((resolution.TotalMinutes*(int)(nowToBaseDateDifference/resolution.TotalMinutes)) +
resolution.TotalMinutes));
if(timestamp.Minute % resolution.Minutes == 0)
modifiedDate = modifiedDate.Add(-resolution);
return modifiedDate;
}
如果您的时间跨度是一天的因数(864000000000个刻度),则此答案有效
获取时间戳和时间跨度中的刻度数。取二的模数,这将给出周期内到目前为止的刻度数。如果这是零,那么你可以认为这是前一个时期的结束,你已经完成了。否则,减去该值即为周期的开始,然后加上时间跨度中的节拍数即为周期的结束。如果您的时间跨度是一天的因数(864000000000节拍),则此答案有效
获取时间戳和时间跨度中的刻度数。取二的模数,这将给出周期内到目前为止的刻度数。如果这是零,那么你可以认为这是前一个时期的结束,你已经完成了。否则,减去该值即为周期的开始,然后再加上时间跨度中的刻度数即为周期的结束。类似的内容?它使用的是
int
,而不是TimeSpan
public static DateTime TimeRoundUp(DateTime dt, int Interval)
{
int nextMin = (int)(dt.Minute / Interval);
int lowerEdge = nextMin * Interval;
int upperEdge = lowerEdge + Interval;
if (dt.Minute - lowerEdge < upperEdge - dt.Minute)
{
nextMin = lowerEdge - dt.Minute;
}
else
{
nextMin = upperEdge - dt.Minute;
}
if (nextMin > 59)
{
nextMin = 60 - dt.Minute;
}
dt = dt.AddMinutes(nextMin);
dt = dt.AddSeconds(-dt.Second); // zero seconds
return dt;
}
publicstaticdatetime-TimeRoundUp(DateTime-dt,int-Interval)
{
int nextMin=(int)(dt.分钟/间隔);
int lowerEdge=nextMin*间隔;
int upperEdge=下边缘+间隔;
如果(dt.Minute-lowerEdge59)
{
下一分钟=60-dt.分钟;
}
dt=dt.增加分钟数(下一分钟);
dt=dt.AddSeconds(-dt.Second);//零秒
返回dt;
}
我还没有完全测试过它,但它可以给你一个开始。像这样的东西?它使用的是
int
,而不是TimeSpan
public static DateTime TimeRoundUp(DateTime dt, int Interval)
{
int nextMin = (int)(dt.Minute / Interval);
int lowerEdge = nextMin * Interval;
int upperEdge = lowerEdge + Interval;
if (dt.Minute - lowerEdge < upperEdge - dt.Minute)
{
nextMin = lowerEdge - dt.Minute;
}
else
{
nextMin = upperEdge - dt.Minute;
}
if (nextMin > 59)
{
nextMin = 60 - dt.Minute;
}
dt = dt.AddMinutes(nextMin);
dt = dt.AddSeconds(-dt.Second); // zero seconds
return dt;
}
publicstaticdatetime-TimeRoundUp(DateTime-dt,int-Interval)
{
int nextMin=(int)(dt.分钟/间隔);
int lowerEdge=nextMin*间隔;
int upperEdge=下边缘+间隔;
如果(dt.Minute-lowerEdge59)
{
下一分钟=60-dt.分钟;
}
dt=dt.增加分钟数(下一分钟);
dt=dt.AddSeconds(-dt.Second);//零秒
返回dt;
}
虽然我还没有完全测试过它,但它可以给您一个开始。欢迎使用。你试过代码吗?如果是这样,请编辑答案以添加相关代码。提示一下,模
%
运算符是您的朋友。这不是答案,但可以帮助你:这应该会帮助你:欢迎来到SO。你试过代码吗?如果是这样,请编辑答案以添加相关代码。提示一下,模%
运算符是您的朋友。这不是答案,但可以帮助您:这应该可以帮助您: