C# PR

【C#】DateTime型の値を切り捨てる方法【ミリ秒から時単位まで解説】

アイキャッチ(c_sharp)
記事内に商品プロモーションを含む場合があります

プログラミングにおいて、日時の情報を扱う際には、特定の精度で時間を切り捨てる操作が求められることがよくあります。
この記事では、C#でDateTimeオブジェクトの各単位を切り捨てる簡単な方法を、初心者の方にも理解しやすい形でご紹介します。

この記事でわかること
  • ミリ秒以下の時間を切り捨てる方法
  • 秒以下の時間を切り捨てる方法
  • 分以下の時間を切り捨てる方法
  • 時以下の時間を切り捨てる方法

ミリ秒以下の切り捨て

プログラミングで時間を扱う際、特に日時の比較や保存を行う際に「ミリ秒単位の精度は必要ない」と感じる場面が往々にしてあります。
そのような場合、日時のデータからミリ秒以下の情報を取り除く、つまり切り捨てを行いたいと考えることが一般的です。
しかし、これを行う際には適切な方法を理解しておく必要があります。

まず、C#におけるDateTimeオブジェクトは、Ticksという単位で時間を表現しています。
1 Tickは100ナノ秒を意味し、1ミリ秒は10,000 Ticksに相当します。
そのため、ミリ秒以下を切り捨てるには、現在のTicks数を一定の値で除算し、その結果を基に新たなDateTimeオブジェクトを生成する必要があります。

以下に、ミリ秒以下を切り捨てる具体的なコードを示します。
このコードは、現在時刻からミリ秒以下を切り捨てるものです。


using System;

class Program
{
	static void Main()
	{
		// 現在時刻を取得します。
		var now = DateTime.Now;

		// TimeSpan.TicksPerSecondを用いて、秒単位で切り捨てるための余りを計算します。
		var excessTicks = now.Ticks % TimeSpan.TicksPerSecond;

		// 余りのTicksを減算して、ミリ秒以下を切り捨てます。
		var result = new DateTime(now.Ticks - excessTicks);

		// 結果を表示します。
		Console.WriteLine("ミリ秒以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
	}
}

まず現在のTicks数を計算し、その後で10000(1ミリ秒のTicks数)で割った余りを現在のTicks数から減算することで、ミリ秒以下を取り除いています。
そして、その結果を基に新しいDateTimeオブジェクトを作成し、ミリ秒以下が切り捨てられた時間を得ることが可能です。

コードは以下のように簡潔に書くこともできます。


using System;

class Program
{
	static void Main()
	{
		var now = DateTime.Now;
		var result = now.AddTicks(-(now.Ticks % TimeSpan.TicksPerSecond));
		Console.WriteLine("ミリ秒以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
	}
}
結果

ミリ秒以下切り捨て後: 2023/10/28 22:44:52.000

この手法を利用することで、データベースに保存する前や、他のシステムと日時を同期する際など、様々なシチュエーションでミリ秒以下の情報を簡単に切り捨てることが可能です。

秒以下の切り捨て

「秒以下の切り捨て」は、時間の精度をより大まかにする場合に用います。
例えば、ログのタイムスタンプや、特定のイベントの時間記録などで秒までの情報が必要ない場合に適しているでしょう。

この操作では、分以上の情報は保持しつつ、秒及びそれ以下の情報を0にリセットします。
これにより、分単位で時間を均一化することが可能です。

具体的な方法としては、DateTimeのTicksプロパティとTimeSpanの機能を利用します。


using System;

class Program
{
	static void Main()
	{
		// 現在時刻を取得します。
		var now = DateTime.Now;

		// TimeSpan.TicksPerMinuteを用いて、分単位で切り捨てるための余りを計算します。
		var excessTicks = now.Ticks % TimeSpan.TicksPerMinute;

		// 余りのTicksを減算して、秒以下を切り捨てます。
		var result = new DateTime(now.Ticks - excessTicks);

		// 結果を表示します。
		Console.WriteLine("秒以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
	}
}

このコードは、現在時刻のTicksから余分なTicks(秒以下)を取り除くことで、分単位の時間に整形しています。

コードは以下のように簡潔に書くこともできます。


using System;

class Program
{
	static void Main()
	{
		var now = DateTime.Now;
		var result = now.AddTicks(-(now.Ticks % TimeSpan.TicksPerMinute));
		Console.WriteLine("秒以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
	}
}
結果

秒以下切り捨て後: 2023/10/28 22:54:00.000

分以下の切り捨て

「分以下の切り捨て」は、さらに広い範囲で時間の精度を揃える必要がある場合に使用します。
具体的には、時間単位での操作や記録を行いたいシナリオで有効です。

この処理では、時間の値はそのままに、分とそれ以下の数値を0にします。

以下のコードは、その操作を行う簡単な例です。


using System;

class Program
{
    static void Main()
    {
        // 現在時刻を取得します。
        var now = DateTime.Now;

        // TimeSpan.TicksPerHourを用いて、時単位で切り捨てるための余りを計算します。
        var excessTicks = now.Ticks % TimeSpan.TicksPerHour;

        // 余りのTicksを減算して、分以下を切り捨てます。
        var result = new DateTime(now.Ticks - excessTicks);

        // 結果を表示します。
        Console.WriteLine("分以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
    }
}

ここでは、TimeSpan.TicksPerHourを用いて、1時間のTicks数を取得し、それを使って分以下を切り捨てる処理を行っています。

コードは以下のように簡潔に書くこともできます。


using System;

class Program
{
	static void Main()
	{
		var now = DateTime.Now;
		var result = now.AddTicks(-(now.Ticks % TimeSpan.TicksPerHour));
		Console.WriteLine("分以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
	}
}
結果

分以下切り捨て後: 2023/10/28 23:00:00.000

時以下の切り捨て

「時以下の切り捨て」は、日付のみを扱いたい場合、つまり年月日情報のみが必要で、時間以降の情報を取り除きたいシナリオに対応します。
データベースに日付情報を保存する場合や、日付を基にした処理を行う場合など、様々な状況で使用できます。

C#では、この操作を非常にシンプルに実行できる方法が提供されています。
DateTimeオブジェクトのDateプロパティを使用するだけで、時以下が切り捨てられ、日付のみの情報を取得できます。


using System;

class Program
{
	static void Main()
	{
		// 現在時刻を取得します。
		var now = DateTime.Now;

		// Dateプロパティを使用して、時以下を切り捨てます。
		var result = now.Date;

		// 結果を出力します。
		Console.WriteLine("時以下切り捨て後: " + result.ToString("yyyy/MM/dd HH:mm:ss.fff"));
	}
}
結果

時以下切り捨て後: 2023/10/28 00:00:00.000

この方法は、DateTimeオブジェクトが持つ日付部分をそのまま残し、時間部分を取り除くため、コードがシンプルで直感的です。

まとめ

以上、C#でDateTimeオブジェクトの切り捨てを行うさまざまな方法をご紹介しました。
プログラム上で時間を扱う際には、これらの切り捨て技術が非常に役立ちます。
目的に応じて適切な切り捨て単位を選び、効率的なコードを心がけましょう。

これらの基本を理解しておくことで、さらに複雑な日時操作もスムーズに扱えるようになるでしょう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です