C# - DateTime のミリ秒を切り捨てる

ミリ秒の値をゼロにするには AddTicksメソッド と Ticksプロパティ を使用し、ミリ秒以下の値を減算します。

ミリ秒以下を切り捨てる方法

DateTime ミリ秒以下切り捨て結果 = 対象のDateTime値.AddTicks((対象のDateTime値.Ticks % TimeSpan.TicksPerSecond) * -1);
  1. Ticksプロパティで ティック数 を取得します。1 ティックは、1,000 万分の 1 秒 です。
  2. 取得した Ticks を1秒(10000000)で割った余りを求めます。

    余り = 対象のDateTime値.Ticks % TimeSpan.TicksPerSecond(定数値10000000)

  3. 取得した Ticks から、2. で計算した余りを引きます。

    対象のDateTime値.AddTicks(余り * -1)

サンプルコード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"));
サンプルコードの実行結果(Visual Studio)
サンプルコードの実行結果(Visual Studio)

サンプルコード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"));
サンプルコードの実行結果(Visual Studio)
サンプルコードの実行結果(Visual Studio)

注意 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"));
サンプルコードの実行結果(Visual Studio)
サンプルコードの実行結果(Visual Studio)

検証環境