Inf*_*nd' 14 .net c# datetime rounding
我需要根据DateTime变量中的分钟来舍入小时数.条件是:如果分钟小于30,则必须将分钟设置为零并且不更改为小时,否则如果分钟> = 30,则小时必须设置为小时+ 1并且分钟再次设置为零.秒被忽略.
例如:
11/08/2008 04:30:49应该成为11/08/2008 05:00:00
并且11/08/2008 04:29:49应该成为11/08/2008 04:00:00
我编写的代码完全正常,但只是想知道一个更好的方法,如果可以写,也会欣赏替代方法.
string date1 = "11/08/2008 04:30:49";
DateTime startTime;
DateTime.TryParseExact(date1, "MM/dd/yyyy HH:mm:ss", null,
System.Globalization.DateTimeStyles.None, out startTime);
if (Convert.ToInt32((startTime.Minute.ToString())) > 29)
{
startTime = DateTime.Parse(string.Format("{0}/{1}/{2} {3}:{4}:{5}",
startTime.Month.ToString(), startTime.Day.ToString(),
startTime.Year.ToString(), startTime.Hour.ToString(), "00", "00"));
startTime = startTime.Add(TimeSpan.Parse("01:00:00"));
Console.WriteLine("startTime is :: {0}",
startTime.ToString("MM/dd/yyyy HH:mm:ss"));
}
else
{
startTime = DateTime.Parse(string.Format("{0}/{1}/{2} {3}:{4}:{5}",
startTime.Month.ToString(),
startTime.Day.ToString(), startTime.Year.ToString(),
startTime.Hour.ToString(), "00", "00"));
Console.WriteLine("startTime is :: {0}",
startTime.ToString("MM/dd/yyyy HH:mm:ss"));
}
Run Code Online (Sandbox Code Playgroud)
tva*_*son 31
作为替代方案:
public static DateTime Round( DateTime dateTime )
{
var updated = dateTime.AddMinutes( 30 );
return new DateTime( updated.Year, updated.Month, updated.Day,
updated.Hour, 0, 0, dateTime.Kind );
}
Run Code Online (Sandbox Code Playgroud)
P D*_*ddy 24
如果速度是一个问题,以下应该是最快的方法:
static DateTime RoundToHour(DateTime dt){
long ticks = dt.Ticks + 18000000000;
return new DateTime(ticks - ticks % 36000000000, dt.Kind);
}
Run Code Online (Sandbox Code Playgroud)
这也是一种非常简单直接的方法.
为了解释,DateTime结构实际上没有存储年,月,日,小时,分钟等的字段.它存储一个单独的long值,即自某个时期(1月1日,公元1年)以来的"滴答"数量.刻度是100纳秒,或者是10,000,000秒.
只要您使用任何日期/时间属性,它就会除以适当的常量.
所以在这里,我们添加一个等于30分钟的常数(30*60*1e7 = 18000000000个刻度),然后在除以等于1小时的常数(60*60*1e7 = 36000000000个刻度)后减去余数.
关于什么:
public static DateTime RoundToHours(DateTime input)
{
DateTime dt = new DateTime(input.Year, input.Month, input.Day, input.Hour, 0, 0);
if (input.Minute > 29)
return dt.AddHours(1);
else
return dt;
}
Run Code Online (Sandbox Code Playgroud)
无需转换为字符串并再次返回!
编辑:如果小时为23,则在构造函数中
使用a input.Hour+1将失败..AddHours(1)将在第二天正确导致'0:00'.
开始!
var rounded = date.AddMinutes(30).Date.AddHours(date.AddMinutes(30).Hour);
Run Code Online (Sandbox Code Playgroud)
对于那些想要它的人
var floored = date.Date.AddHours(date.Hours)
Run Code Online (Sandbox Code Playgroud)