我正在尝试将传入请求的时间戳与数据库存储值进行比较.SQL Server当然会保留一些毫秒的精度,当读入.NET DateTime时,它包括那些毫秒.但是,对系统的传入请求不提供该精度,因此我需要简单地删除毫秒.
我觉得我错过了一些明显的东西,但我还没有找到一种优雅的方法(C#).
我想将日期/时间舍入到图表应用程序的最近区间.我想要一个像下面这样的扩展方法签名,以便可以在任何精度级别上实现舍入:
static DateTime Round(this DateTime date, TimeSpan span);
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果我通过十分钟的时间跨度,它将四舍五入到最接近的十分钟间隔.我不能理解我的实施,并希望你们中的一个人之前会写过或使用类似的东西.
我认为楼层,天花板或最近的实施都可以.
有任何想法吗?
编辑:感谢@tvanfosson和@ShuggyCoUk,实现如下:
public static class DateExtensions {
public static DateTime Round(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks + (span.Ticks / 2) + 1)/ span.Ticks;
return new DateTime(ticks * span.Ticks);
}
public static DateTime Floor(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks / span.Ticks);
return new DateTime(ticks * span.Ticks);
}
public static DateTime Ceil(this DateTime date, TimeSpan span) {
long ticks = (date.Ticks + span.Ticks - …
Run Code Online (Sandbox Code Playgroud) 我想将DateTime四舍五入到最接近的5秒.这是我目前正在做的方式,但我想知道是否有更好或更简洁的方式?
DateTime now = DateTime.Now;
int second = 0;
// round to nearest 5 second mark
if (now.Second % 5 > 2.5)
{
// round up
second = now.Second + (5 - (now.Second % 5));
}
else
{
// round down
second = now.Second - (now.Second % 5);
}
DateTime rounded = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, second);
Run Code Online (Sandbox Code Playgroud)
我需要根据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)