1. ホーム
  2. c#

[解決済み】.NETのDateTimeからミリ秒を切り捨てる方法

2022-03-25 20:48:32

質問

受信したリクエストのタイムスタンプと、データベースに保存された値を比較しようとしています。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
    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
...