如何从.NET DateTime截断毫秒数

邮差的信 提交于 2020-03-18 16:02:05

某厂面试归来,发现自己落伍了!>>>

我正在尝试将传入请求中的时间戳与数据库存储值进行比较。 SQL Server当然会在时间上保持毫秒级的精度,当读入.NET DateTime时,它会包含这些毫秒级。 但是,对系统的传入请求没有提供这种精度,因此我只需要减少毫秒数即可。

我觉得我缺少明显的东西,但是我还没有找到一种优雅的方法(C#)。


#1楼

DateTime d = DateTime.Now;
d = d.AddMilliseconds(-d.Millisecond);

#2楼

var date = DateTime.Now;

date = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Kind);

#3楼

为什么不比较毫秒而不是比较毫秒?

DateTime x; DateTime y;
bool areEqual = (x-y).TotalSeconds == 0;

要么

TimeSpan precision = TimeSpan.FromSeconds(1);
bool areEqual = (x-y).Duration() < precision;

#4楼

不太明显,但快了2倍以上:

// 10000000 runs

DateTime d = DateTime.Now;

// 484,375ms
d = new DateTime((d.Ticks / TimeSpan.TicksPerSecond) * TimeSpan.TicksPerSecond);

// 1296,875ms
d = d.AddMilliseconds(-d.Millisecond);

#5楼

以下内容适用于具有小数毫秒的DateTime,并且还保留Kind属性(Local,Utc或Undefined)。

DateTime dateTime = ... anything ...
dateTime = new DateTime(
    dateTime.Ticks - (dateTime.Ticks % TimeSpan.TicksPerSecond), 
    dateTime.Kind
    );

或更短或更短:

dateTime = dateTime.AddTicks( - (dateTime.Ticks % TimeSpan.TicksPerSecond));

可以将其概括为扩展方法:

public static DateTime Truncate(this DateTime dateTime, TimeSpan timeSpan)
{
    if (timeSpan == TimeSpan.Zero) return dateTime; // Or could throw an ArgumentException
    if (dateTime == DateTime.MinValue || dateTime == DateTime.MaxValue) return dateTime; // do not modify "guard" values
    return dateTime.AddTicks(-(dateTime.Ticks % timeSpan.Ticks));
}

其用法如下:

dateTime = dateTime.Truncate(TimeSpan.FromMilliseconds(1)); // Truncate to whole ms
dateTime = dateTime.Truncate(TimeSpan.FromSeconds(1)); // Truncate to whole second
dateTime = dateTime.Truncate(TimeSpan.FromMinutes(1)); // Truncate to whole minute
...
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!