ミリ秒以下を切り捨てる方法
DateTime ミリ秒以下切り捨て結果 = 対象のDateTime値.AddTicks((対象のDateTime値.Ticks % TimeSpan.TicksPerSecond) * -1);
- Ticksプロパティで ティック数 を取得します。1 ティックは、1,000 万分の 1 秒 です。
-
取得した Ticks を1秒(10000000)で割った余りを求めます。
余り = 対象のDateTime値.Ticks % TimeSpan.TicksPerSecond(定数値10000000)
-
取得した Ticks から、2. で計算した余りを引きます。
対象のDateTime値.AddTicks(余り * -1)
- % 演算子は割り算の余りを返します。
- TimeSpan.TicksPerSecond は定数値 10000000 で、1秒のティック数 です。
- AddTicks メソッドは引数に渡されたティック数を加算した DateTimeオブジェクトを返します。
サンプルコード1
次のサンプルコードはシステム日時を取得し、ミリ秒以下の値をゼロにしています。// システム日時の取得
DateTime value = DateTime.Now;
// 切り捨て前
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// ミリ秒以下切り捨て
DateTime newValue = value.AddTicks((value.Ticks % TimeSpan.TicksPerSecond) * -1);
// ミリ秒以下、切り捨て後
Console.WriteLine(newValue.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// 元の変数はそのまま
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));

サンプルコード2
次のサンプルコードはシステム日時を取得し、マイクロ秒~時以下 の値をゼロにしています。// システム日時の取得
var value = DateTime.Now;
// 切り捨て前
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// マイクロ秒以下切り捨て
value = value.AddTicks((value.Ticks % TimeSpan.TicksPerMillisecond) * -1);
Console.WriteLine("マイクロ秒以下、切り捨て後");
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// ミリ秒以下切り捨て
value = value.AddTicks((value.Ticks % TimeSpan.TicksPerSecond) * -1);
// ミリ秒以下、切り捨て後
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// 秒以下切り捨て
value = value.AddTicks((value.Ticks % TimeSpan.TicksPerMinute) * -1);
// 秒以下、切り捨て後
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// 分以下切り捨て
value = value.AddTicks((value.Ticks % TimeSpan.TicksPerHour) * -1);
// 分以下、切り捨て後
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// 時以下切り捨て
value = value.AddTicks((value.Ticks % TimeSpan.TicksPerDay) * -1);
Console.WriteLine("時以下、切り捨て後");
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));

注意 AddMillisecondsメソッドでは期待通りに動作しません。
AddMillisecondsメソッド と Millisecondプロパティ では マイクロ秒 が残るので、期待通りに動作しません。次のサンプルコードは AddMillisecondsメソッド と Millisecondプロパティ を使用してミリ秒をゼロにしていますが、マイクロ秒がゼロになっていません。
// システム日時の取得
var value = DateTime.Now;
// 元の日時
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));
// マイクロ秒を減算
value = value.AddMilliseconds(value.Millisecond * -1);
// マイクロ秒の減算後
Console.WriteLine(value.ToString("yyyy/MM/dd HH:mm:ss fffffff"));

検証環境
- .NET 6.0
- Microsoft Visual Studio Enterprise 2022 Version 17.2.6
- Microsoft Windows 10 Enterprise Version 22H2 OS Build 19045.2251 Experience: Windows Feature Experience Pack 120.2212.4180.0