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オブジェクトが持つ日付部分をそのまま残し、時間部分を取り除くため、コードがシンプルで直感的です。

キャリア形成/給与還元
ひとつひとつ真摯に向き合う企業
ONE_WEDGE社員募集

株式会社 ONE WEDGEでは、新たな仲間を募集しています!

私たちと一緒に、革新的で充実したキャリアを築きませんか?
当社は、従業員が仕事と私生活のバランスを大切にできるよう、充実した福利厚生を整えています。

  • 完全週休2日制(土日休み)で、祝日や夏季休暇、年末年始休暇もしっかり保証!
  • 様々な休暇制度(有給、慶弔、産前・産後、育児、バースデー休暇)を完備!
  • 従業員の成長と健康を支援するための表彰制度、資格取得支援、健康促進手当など!
  • 生活を支えるテレワーク手当、記事寄稿手当、結婚祝金・出産祝金など、様々な手当を提供!
  • 自己啓発としての書籍購入制度や、メンバー間のコミュニケーションを深める交流費補助!
  • 成果に応じた決算賞与や、リファラル採用手当、AI手当など、頑張りをしっかり評価!
  • ワークライフバランスを重視し、副業もOK!

株式会社 ONE WEDGEでは、一人ひとりの従業員が自己実現できる環境を大切にしています。
共に成長し、刺激を与え合える仲間をお待ちしております。
あなたの能力と熱意を、ぜひ当社で発揮してください。
ご応募お待ちしております!

ホームページ、採用情報は下記ボタンからご確認ください!

応募、ご質問など、LINEでお気軽にご相談ください♪

まとめ

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

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

COMMENT

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