如何截断.NET DateTime的毫秒数

我试图比较从传入请求到数据库存储值的时间戳。 SQL Server当然会保持一些毫秒的精度,并且在读入.NET DateTime时,它包含那些毫秒。 然而,传入的系统请求并不提供这种精度,所以我需要简单地减少毫秒。

我觉得我错过了一些显而易见的东西,但我还没有找到一种优雅的方式来实现它(C#)。


以下将适用于具有分数毫秒的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
    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
...

var date = DateTime.Now;

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

这是一个基于以前答案的扩展方法,可以让你截取任何分辨率......

用法:

DateTime myDateSansMilliseconds = myDate.Truncate(TimeSpan.TicksPerSecond);
DateTime myDateSansSeconds = myDate.Truncate(TimeSpan.TicksPerMinute)

类:

public static class DateTimeUtils
{
    /// <summary>
    /// <para>Truncates a DateTime to a specified resolution.</para>
    /// <para>A convenient source for resolution is TimeSpan.TicksPerXXXX constants.</para>
    /// </summary>
    /// <param name="date">The DateTime object to truncate</param>
    /// <param name="resolution">e.g. to round to nearest second, TimeSpan.TicksPerSecond</param>
    /// <returns>Truncated DateTime</returns>
    public static DateTime Truncate(this DateTime date, long resolution)
    {
        return new DateTime(date.Ticks - (date.Ticks % resolution), date.Kind);
    }
}
链接地址: http://www.djcxy.com/p/36439.html

上一篇: How to truncate milliseconds off of a .NET DateTime

下一篇: Can a Byte[] Array be written to a file in C#?