如何将时间四舍五入到最接近的 X 分钟?
是否有一个简单的函数可以将 DateTime
向上舍入到最接近的 15 分钟?
例如
2011-08-11 16:59
变为 2011-08-11 17:00
2011-08-11 17:00
保持为 <代码>2011-08-11 17:00
2011-08-11 17:01
变为2011-08-11 17:15
Is there a simple function for rounding UP a DateTime
to the nearest 15 minutes?
E.g.
2011-08-11 16:59
becomes 2011-08-11 17:00
2011-08-11 17:00
stays as 2011-08-11 17:00
2011-08-11 17:01
becomes 2011-08-11 17:15
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(15)
示例:
Example:
想出了一个不涉及乘法和除法
长
数字的解决方案。用法:
Came up with a solution that doesn't involve multiplying and dividing
long
numbers.Usage:
我已经看到了许多有用的实现,例如来自 @dtb 或 @redent84 的实现。
由于性能差异可以忽略不计,因此我远离位移并简单地创建了可读代码。我经常在我的实用程序库中使用这些扩展。
I've seen a nuber of useful implementations, like the one from @dtb or @redent84.
Since the performance difference is negligible, I stayed away from bit shifts and simply created readable code. I often use these extensions in my utility libraries.
如果您需要四舍五入到最近的时间间隔(而不是向上)
那么我建议使用以下内容
if you need to round to a nearest time interval (not up)
then i suggest to use the following
结果:
Results:
由于我讨厌重新发明轮子,因此我可能会遵循此算法将 DateTime 值舍入到指定的时间增量 (Timespan):
DateTime
值转换为十进制浮点值表示TimeSpan
单位的整数和小数。TimeSpan
单位中的刻度数来缩放回刻度。DateTime
值并将其返回给调用者。这是代码:
Since I hate reinventing the wheel, I'd probably follow this algorithm to round a DateTime value to a specified increment of time (Timespan):
DateTime
value to be rounded to a decimal floating-point value representing the whole and fractional number ofTimeSpan
units.Math.Round()
.TimeSpan
unit.DateTime
value from the rounded number of ticks and return it to the caller.Here's the code:
我的版本
作为一种方法,它会像这样锁定
并被这样调用
My version
As a method it would lock like this
and is called like that
更详细的解决方案,使用模并避免不必要的计算。
A more verbose solution, that uses modulo and avoids unnecessary calculation.
我的 DateTimeOffset 版本,基于 Ramon 的回答:
My DateTimeOffset version, based on Ramon's answer:
优雅的?
Elegant?
注意:上面的公式是不正确的,即:
应重写为:
Caution: the formula above is incorrect, i.e. the following:
should be rewritten as:
这是一个简单的解决方案,可以四舍五入到最接近的 1 分钟。它保留了 DateTime 的 TimeZone 和 Kind 信息。可以对其进行修改以进一步满足您自己的需求(如果您需要四舍五入到最近的 5 分钟等)。
This is a simple solution to round up to the nearest 1 minute. It preserves the TimeZone and Kind information of the DateTime. It can be modified to suit your own needs further (if you need to round to the nearest 5 minutes, etc).
您可以使用此方法,它使用指定的日期来确保它维护先前在日期时间对象中指定的任何全球化和日期时间类型。
.Net Fiddle Test
如果你想使用TimeSpan进行舍入,可以使用这个。
时间跨度小提琴
You can use this method, it uses the specified date to ensure it maintains any of the globalization and datetime kind previously specified in the datetime object.
.Net Fiddle Test
If you want to use the TimeSpan to round, you can use this.
TimeSpan Fiddle
Ramon Smits 的解决方案,带有 DateTime.MaxValue 检查:
Solution from Ramon Smits with DateTime.MaxValue check:
您可以尝试这样做:
每个部分(小时,分钟)必须递增并调整为适当的溢出值,例如 59 分钟 > 00则hr加1,如果是23,hr就变成00。
前任。 07:34:57 舍入为 07:35,09:59:45 舍入为 10:00,23:59:45 舍入为 00:00,即第二天的时间。
You can try this:
Each part (hr, min) must be incremented and adjusted to proper value for overflow, like 59 min > 00 then add 1 to hr, if it is 23, hr becomes 00.
Ex. 07:34:57 is rounded to 07:35, 09:59:45 is rounded to 10:00, 23:59:45 is rounded to 00:00, which is the following day's time.