C#を使用してアプリケーション開発するときは、日付や時刻を扱うことが多いです。特にシステム間連携やデータ処理をするときは、正確な日時処理が求められます。
C#のDateTime構造体は日付や時刻を扱うための基本的なデータ型であり、日時処理の最適化やタイムスタンプ管理に欠かせない機能です。しかし、その豊富な機能と多様な使い方を完全に理解しているエンジニアは意外と少ないのではないでしょうか。
本記事では、C#のDateTime構造体について、基本から応用までを網羅的に解説します。C#のDateTimeを使用して日付や時刻を扱う方法やフォーマット設定などを具体例とともに解説するので、ぜひ参考にしてみてください。
目次
1.C# DateTimeとは何か?基本的な使い方
DateTimeはC#で日時を扱うための構造体で、年・月・日・時・分・秒・ミリ秒などを管理できます。C#のSystem名前空間に属し、日時の計算・比較・フォーマット変換など幅広い操作をサポートしています。
この章では、C#のDateTimeについて基本的な使い方と初期化や初期値について解説します。
C# DateTimeの基本構造と特徴
DateTimeは.NET Frameworkが提供する構造体で、日付と時刻を表現するために使用されます。System名前空間に属しており、年、月、日、時、分、秒、ミリ秒といった単位で時間を扱えます。
DateTimeの基本的な使用例は以下のとおりです。
// DateTimeの基本的な使用例 DateTime currentDateTime = DateTime.Now; Console.WriteLine($"現在の日時: {currentDateTime}"); |
なお、DateTime構造体は値型でありnullを許容しません。また、DateTimeオブジェクトは不変(immutable)であるため、一度作成されたDateTimeオブジェクトの値は変更できません。DateTimeオブジェクトに対する加算や減算といった操作は、新しいDateTimeオブジェクトを生成して返します。
C# DateTimeの初期化方法と初期値
DateTimeの初期化には、いくつかの方法があります。
デフォルトコンストラクタを使用した場合、DateTimeの初期値はDateTime.MinValue(西暦0001年1月1日 00:00:00)となります。一方で、特定の日時を指定して初期化する場合は、new DateTime()コンストラクタを使用します。
DateTimeの主な初期化方法は以下のとおりです。
// 現在の日時を取得 DateTime now = DateTime.Now;
DateTime today = DateTime.Today;
DateTime specificDate = new DateTime(2025, 3, 23, 15, 30, 0);
DateTime utcNow = DateTime.UtcNow;
DateTime defaultValue = default(DateTime); |
C# DateTimeとTimeSpanの違い
DateTimeとTimeSpanはどちらも日付と時刻を扱う構造体ですが、その用途は異なります。
DateTimeは特定の日付と時刻を表すのに対し、TimeSpanは時間間隔を表します。TimeSpanは2つのDateTimeの差分を計算したり、DateTimeに一定の時間を加減算したりするときに使用します。
TimeSpanの使用例は以下のとおりです。
// 2つの日時の差分を計算 DateTime start = new DateTime(2025, 3, 20); DateTime end = new DateTime(2025, 3, 23); TimeSpan duration = end - start; Console.WriteLine($"日数差: {duration.TotalDays}日"); // 3日
DateTime now = DateTime.Now; DateTime threeDaysLater = now.Add(new TimeSpan(3, 0, 0, 0)); // 3日後 Console.WriteLine($"3日後: {threeDaysLater}"); |
上記の例のように、ある日付の3日後を計算したいときにTimeSpan構造体を使うこともあります。DateTimeは特定の日時を表すのに使用し、TimeSpanは2つの日付間の日数や時間差を計算する際に使用するものだと覚えておきましょう。
2.C# DateTimeで日付を扱う方法
C#のDateTime構造体を使用することで、日付の取得や設定といった操作を簡単に行えます。
この章ではC#のDateTime構造を使用して年月日を扱う方法や、年月・日付のみを取得する方法を紹介します。
C# DateTimeで年月日を取得・設定する方法
DateTimeオブジェクトから年月日を取得するには、Year、Month、Dayプロパティを使用します。
DateTimeオブジェクトから年月日を取得するコードの例は以下のとおりです。
DateTime date = new DateTime(2025, 3, 23);
int month = date.Month; // 3 int day = date.Day; // 23
|
また、DateTimeオブジェクトの年月日を設定するには、DateTimeコンストラクタを使用して新しいDateTimeオブジェクトを作成します。
例えば、既存のDateTimeオブジェクトから、特定の年月日の部分だけを変更した新しいDateTimeオブジェクトを作成することもできます。
DateTime original = new DateTime(2025, 3, 23);
DateTime newYear = new DateTime(2026, original.Month, original.Day, original.Hour, original.Minute, original.Second); |
ただ、日付の加算や減算にはAddDaysメソッドやAddYearsメソッドを使うこともあります。用途や要件に応じて使い分けるとよいでしょう。
C# DateTimeで年月のみを取得する方法
C#のDateTimeから年月のみを取得する場合は、YearとMonthプロパティを組み合わせて使用します。また、フォーマットを指定して年月を文字列として取得することも可能です。
コード例は以下のとおりです。
DateTime date = new DateTime(2025, 3, 23);
int year = date.Year; int month = date.Month; Console.WriteLine($"年: {year}, 月: {month}");
string formattedDate = date.ToString("yyyy/MM"); Console.WriteLine($"フォーマットされた年月: {formattedDate}"); |
日付同士で年月のみ比較したい場合は、YearプロパティやMonthプロパティ同士を比較します。
DateTime date1 = new DateTime(2025, 3, 15); DateTime date2 = new DateTime(2025, 3, 25);
bool sameYearMonth = date1.Year date2.Year && date1.Month date2.Month; Console.WriteLine($"同じ年月か: {sameYearMonth}"); // True |
C# DateTimeで日付のみを取得する方法
日時から日付部分のみを取得するには、Dateプロパティを使用します。このプロパティは、時刻部分を切り捨てた新しいDateTimeオブジェクトを返します。
Dateプロパティの使用例は以下のとおりです。
DateTime dt = DateTime.Now; DateTime dateOnly = dt.Date; // 時刻部分が00:00:00に設定されたDateTimeオブジェクトを取得 Console.WriteLine(dateOnly); |
Dateプロパティは、DateTimeオブジェクトの日付部分のみを表す新しいDateTimeオブジェクトを返します。返されるDateTimeオブジェクトの時刻部分は00:00:00に設定されています。
なお、DateTime構造体のDayプロパティでも日付の値のみ取得できます。ただしDayプロパティで取得できるのは整数型の日付です。
DateTime dt = DateTime.Now; int dateOnly = dt.Day; // 日付の数値のみ取得 Console.WriteLine(dateOnly); |
上記のように、DayプロパティはDateTimeオブジェクトの日付を表す整数値(1~31)を返します。Dateプロパティとは異なり、DateTimeオブジェクト全体ではなく日付の数値のみが必要な場合に便利です。
Dateプロパティは日付のみのDateTimeオブジェクト、Dayプロパティは日付のみの整数値が取得できると覚えておきましょう。
3.C# DateTimeで時間を扱う方法
C#のDateTime構造体を使用することで、時間の取得や設定といった操作も簡単に行えます。
この章ではC#のDateTime構造体を使用して、時間のみを取得する方法やミリ秒を扱う方法を紹介します。
C# DateTimeで時間のみを取得する方法
DateTimeから日付情報を除いて時間のみを取得するには、いくつかの方法があります。
最も一般的な方法はTimeOfDayプロパティを使用することです。TimeOfDayプロパティは、TimeSpanオブジェクトを返し、時間、分、秒、ミリ秒の情報を含んでいます。
DateTime dateTime = new DateTime(2025, 3, 23, 15, 30, 45, 123);
TimeSpan timeOnly = dateTime.TimeOfDay; Console.WriteLine($"時間のみ(TimeSpan): {timeOnly}"); // 15:30:45.1230000 |
TimeOfDayはTimeSpan型で時間情報を返します。時間の個別の部分にアクセスするには、DateTimeオブジェクトから直接取得することもできます。
DateTime dateTime = new DateTime(2025, 3, 23, 15, 30, 45);
int minute = dateTime.Minute; // 30 int second = dateTime.Second; // 45
|
また、DateTimeから時間のみを文字列出力したい場合は、フォーマット文字列を指定することで実現可能です。
DateTime now = DateTime.Now; string formattedHour = now.ToString("HH"); // 24時間表記 string formattedHour12 = now.ToString("hh tt"); // 12時間表記 + 午前/午後 |
C#のDateTimeで時間のみを取得する方法はいくつかあるので、利用シーンに合わせて適切な方法を選びましょう。
C# DateTimeでミリ秒を扱う方法
DateTimeオブジェクトからミリ秒を取得するには、Millisecondプロパティを使用します。
DateTime dt = DateTime.Now; int milliseconds = dt.Millisecond; // ミリ秒を取得
|
また、ミリ秒を含むDateTimeオブジェクトを作成するには、コンストラクタでミリ秒を指定します。
// ミリ秒を指定して日時を作成 DateTime withMilliseconds = new DateTime(2025, 3, 23, 15, 30, 45, 123); Console.WriteLine($"ミリ秒付き日時: {withMilliseconds:yyyy-MM-dd HH:mm:ss.fff}"); |
ミリ秒は、タイムスタンプの生成や高精度な時間計測など、様々な場面で役立ちます。ただし、DateTime構造体の精度には限界があります。より高精度な時間計測が必要な場合は、Stopwatchクラスを利用するのがおすすめです。
Stopwatchクラスを使用すると、DateTimeよりも高精度に時間計測が可能です。
using System.Diagnostics;
stopwatch.Start();
System.Threading.Thread.Sleep(100);
Console.WriteLine($"経過時間: {stopwatch.ElapsedMilliseconds}ミリ秒"); |
C#で時間計測や経過時間を測定するときは、Stopwatchクラスを使用するのが一般的だと覚えておきましょう。
関連記事
C#演算子完全ガイド:比較・Nullの基礎からオーバーロード・優先順位などの応用まで徹底解説
4.C# DateTimeの書式設定と文字列変換
C#のアプリケーション開発をしていると「ユーザーインターフェースでの表示」「データベースとの連携」「外部システムとの通信」といったさまざまな場面で、日付や時刻を適切なフォーマットで扱う必要があります。
DateTime構造体には、日付や時刻を任意のフォーマットで表現するための豊富な機能が用意されています。この章では、文字列からDateTimeへの変換、DateTimeから文字列への変換、そして年月日のフォーマット設定について詳しく解説します。
文字列からC# DateTimeオブジェクトに変換する方法
文字列をDateTimeオブジェクトに変換するには、DateTime.Parse()またはDateTime.TryParse()メソッドを使用します。これにより、ユーザーからの入力や外部データソースから取得した日時情報をDateTime型に変換できます。
Parseメソッドは、文字列をDateTimeオブジェクトに変換し、変換に失敗した場合は例外が発生します。
string dateString = "2025/03/23 15:30:45"; DateTime parsedDate = DateTime.Parse(dateString); Console.WriteLine($"解析された日時: {parsedDate}"); |
TryParseメソッドを使用すると、変換に成功した場合はtrueを、失敗した場合はfalseを返します。変換が成功したかどうかを確認できるため、エラー処理を定義したい場合に便利です。
string dateString = "2025/03/23 15:30:45"; if (DateTime.TryParse(dateString, out DateTime result)) { Console.WriteLine($"解析成功: {result}"); } else { Console.WriteLine("解析失敗"); } |
また、DateTime.ParseExact()メソッドを使用すると、日付の書式を指定してDateTimeオブジェクトに変換することも可能です。
DateTime exactDate = DateTime.ParseExact("2025-03-24", "yyyy-MM-dd", null); |
C#の標準書式に従っていない日付形式の文字列をDateTimeオブジェクトに変換したいときに便利です。
C# DateTimeを文字列に変換する方法
DateTimeオブジェクトを文字列に変換するには、ToString()メソッドを使用します。ToString()メソッドは、様々な書式指定子を受け取り、DateTimeオブジェクトを書式設定された文字列として返します。
C#標準の日付時刻書式指定文字列を使用する例は、以下のとおりです。
DateTime now = DateTime.Now;
string shortDate = now.ToString("d"); // 例: 2025/03/23
string longDate = now.ToString("D"); // 例: 2025年3月23日
string shortTime = now.ToString("t"); // 例: 15:30
string longTime = now.ToString("T"); // 例: 15:30:45
string fullDateTime = now.ToString("f"); // 例: 2025年3月23日 15:30
string fullLongDateTime = now.ToString("F"); // 例: 2025年3月23日 15:30:45
Console.WriteLine($"長い日付: {longDate}"); Console.WriteLine($"短い時刻: {shortTime}"); Console.WriteLine($"長い時刻: {longTime}"); Console.WriteLine($"完全な日付/時刻(短い時刻): {fullDateTime}"); Console.WriteLine($"完全な日付/時刻(長い時刻): {fullLongDateTime}"); |
C# DateTime 年月日フォーマットの書式設定
DateTimeオブジェクトを年月日のみのフォーマットで文字列に変換するには、カスタム書式指定子を使用します。
DateTime now = DateTime.Now;
string custom1 = now.ToString("yyyy-MM-dd HH:mm:ss"); // 例: 2025-03-23 15:30:45 string custom2 = now.ToString("yyyy年MM月dd日(ddd)"); // 例: 2025年03月23日(日) string custom3 = now.ToString("HH時mm分ss秒"); // 例: 15時30分45秒
Console.WriteLine($"カスタム書式2: {custom2}"); Console.WriteLine($"カスタム書式3: {custom3}"); |
さまざまなカスタム書式指定子を組み合わせることで、DateTimeオブジェクトを自由にフォーマットできます。
また、カスタム書式指定子には年月日だけではなく曜日を取得できるものもあります。文字リテラルと組み合わせるとさまざまな文字列表現ができるので、用途に合わせて適切な書式を指定するとよいでしょう。
DateTime date = new DateTime(2025, 3, 23);
string isoFormat = date.ToString("yyyy-MM-dd"); // 例: 2025-03-23
string slashFormat = date.ToString("yyyy/MM/dd"); // 例: 2025/03/23
string dayMonthYearFormat = date.ToString("dd/MM/yyyy"); // 例: 23/03/2025
string japaneseFormat = date.ToString("yyyy年MM月dd日"); // 例: 2025年03月23日
string withWeekday = date.ToString("yyyy年MM月dd日(ddd)"); // 例: 2025年03月23日(日)
Console.WriteLine($"スラッシュ区切り: {slashFormat}"); Console.WriteLine($"日/月/年形式: {dayMonthYearFormat}"); Console.WriteLine($"日本語形式: {japaneseFormat}"); Console.WriteLine($"曜日付き: {withWeekday}"); |
5.まとめ
DateTime構造体はC#で日時を扱うための基本的なデータ型であり、年月日や時分秒、ミリ秒などを効率的に管理できます。
この記事では、DateTimeの基本的な使い方から、日付操作や時間操作の方法、書式設定と文字列変換の方法を紹介しました。
これらの知識を活用することで、日時処理の最適化やタイムスタンプ管理、システム間連携など、多様な要件に対応したC#アプリケーションの開発が可能になります。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。