例如:
2011-08-11 16:59 变为 2011-08-11 16:30
DateTime RoundDown(DateTime dt, TimeSpan d)
{
return new DateTime((dt.Ticks / d.Ticks) * d.Ticks);
}
例子:
var dt1 = RoundDown(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30));
// dt1 == {11/08/2011 16:30:00}
var dt2 = RoundDown(DateTime.Parse("2011-08-11 17:00"), TimeSpan.FromMinutes(30));
// dt2 == {11/08/2011 17:00:00}
var dt3 = RoundDown(DateTime.Parse("2011-08-11 17:01"), TimeSpan.FromMinutes(30));
// dt3 == {11/08/2011 17:00:00}
我会说这样的话
var time = DateTime.Now;
var rounded = time.AddMinutes(
time.Minute>30 ? -(time.Minute-30) : -time.Minute)
你甚至可以做你自己的扩展
public static class TimeHelper {
public static DateTime RoundDown (this DateTime time)
{
return time.AddMinutes(
time.Minute>30 ? -(time.Minute-30) : -time.Minute);
}
}
编辑
如有必要,此功能还可切割秒/毫秒。感谢您的提示。
public static DateTime RoundDown(this DateTime time)
{
return time.Subtract(
new TimeSpan(0, 0, time.Minute > 30 ? (time.Minute - 30) : time.Minute,
time.Second, time.Millisecond));
}
一个更通用的解决方案四舍五入到最近的时间跨度:
public static DateTime RoundUp(this DateTime dt, TimeSpan d)
{
var delta = (d.Ticks - (dt.Ticks % d.Ticks)) % d.Ticks;
return new DateTime(dt.Ticks + delta);
}
public static DateTime RoundDown(this DateTime dt, TimeSpan d)
{
var delta = dt.Ticks % d.Ticks;
return new DateTime(dt.Ticks - delta);
}
public static DateTime RoundToNearest(this DateTime dt, TimeSpan d)
{
var delta = dt.Ticks % d.Ticks;
bool roundUp = delta > d.Ticks / 2;
return roundUp ? dt.RoundUp(d) : dt.RoundDown(d);
}
它将以这种方式使用:
var date = new DateTime(2010, 02, 05, 10, 35, 25, 450); // 2010/02/05 10:35:25
var rounded = date.RoundToNearest(TimeSpan.FromMinutes(30)); // 2010/02/05 10:30:00
更多在此回应。
DateTime newDateTime = new DateTime(oldDateTime.Year, oldDateTime.Month, oldDateTime.Day
,oldDateTime.Hour, (oldDateTime.Minute / 30) * 30, 0);
利用一些数学
var input = DateTime.Now; // or however you get DateTime
var rounded = input.AddMinutes(-input.TimeOfDay.TotalMinutes % 30d);
请注意,它的属性是 a TimeOfDay
,并且模运算符对双精度数的作用如下:TimeSpan
TotalMinutes
double
47.51 % 30 天 == 17.51
16.2 % 30 天 == 16.2
768.7 % 30 天 == 18.7
您可以将 30d 更改为您喜欢的任何值,而不是零。例如,更改为 15 轮到 15 分钟间隔。从 30d 更改为 -30d,并没有改变我运行的测试的结果。
您可以创建一个舍入扩展方法(为所有 DateTime 值提供此舍入方法):
public static class DateTimeExtensions
{
public static DateTime Round(this DateTime self, double minutesInInterval)
{
if (minutesInInterval == 0d) throw new ArgumentOutOfRangeException("minutesInInterval");
return self.AddMinutes(-self.TimeOfDay.TotalMinutes % minutesInInterval);
}
}
没有这样的功能可用
您可以参考:如何将时间四舍五入到最接近的 X 分钟?
如果需要,您可以自己创建一个
DateTime RoundUp(DateTime dt, TimeSpan d)
{
return new DateTime(((dt.Ticks - d.Ticks + 1) / d.Ticks) * d.Ticks + d.Ticks);
}
例如:
var dt1 = RoundUp(DateTime.Parse("2011-08-11 16:59"), TimeSpan.FromMinutes(30));
// dt1 == {11/08/2011 16:30:00}
以下是我的处理方式。以下是四舍五入到最近 30 分钟的基本方法和重载:
public static DateTime RoundMinutes(this DateTime value)
{
return RoundMinutes(value, 30);
}
public static DateTime RoundMinutes(this DateTime value, int roundMinutes)
{
DateTime result = new DateTime(value.Ticks);
int minutes = value.Minute;
int hour = value.Hour;
int minuteMod = minutes % roundMinutes;
if (minuteMod <= (roundMinutes / 2))
{
result = result.AddMinutes(-minuteMod);
}
else
{
result = result.AddMinutes(roundMinutes - minuteMod);
}
return result;
}