我试图将传入请求的时间戳与数据库存储值进行比较.当然,SQL Server在时间和读入数据时保持了毫秒的精度.NET日期时间,它包括这些毫秒.然而,对系统的传入请求不提供这种精度,所以我只需要删除毫秒.

我觉得我错过了一些显而易见的东西,但我还没有找到一种优雅的方式来做到这一点(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
    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
...

.net相关问答推荐

WinForm Task.Wait :为什么它会阻塞 UI?

在 C# 中,如何使用泛型的基类将泛型接口的所有实例注入到单个构造函数中?

将字符串与容差进行比较

.NET 中的线程安全集合

NonSerialized 属性

HttpClient 请求抛出 IOException

泛型方法是如何、何时、何地具体化的?

使用 EPPlus 时如何设置列类型

extern 在 C# 中是如何工作的?

共享 AssemblyInfo 用于跨解决方案的统一版本控制

如何明智地使用 StringBuilder?

覆盖方法上的 C# 可选参数

创建多个线程并等待所有线程完成

变量MyException已声明但从未使用

如何禁用 Alt + F4 关闭表单?

将月份 int 转换为月份名称

我可以将构造函数参数传递给 Unity 的 Resolve() 方法吗?

从 Visual Studio 2015 发布 - 允许不受信任的证书

.NET Remoting 真的被弃用了吗?

System.ServiceModel 在 .NET Core 项目中找不到