DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

指定した日時のDateTimeオブジェクトを作成する

指定した日時のSystem.DateTimeオブジェクトを作成する方法には、以下のようなものが挙げられます。

  1. DateTime構造体のコンストラクタを呼び出す。
  2. DateTime.Parseメソッドなどを使って、日時を表した文字列をDateTimeに変換する。(この方法は、「日時を表す文字列をDateTimeオブジェクトに変換する」で説明しています。)
  3. VB.NETの場合、「#9/24/2000 3:30:00 PM#」のようなDateリテラルを使用する。(この方法は、MSDNの「日付型 (Date) (Visual Basic)」などが参考になります。)
  4. すでに存在しているDateTimeオブジェクトに時間を足したり引いたりして、新しいDateTimeを作成する。(この方法は、「日時、時間の計算をする」で説明しています。)
  5. DateTime.ToBinaryメソッドでシリアル化された値をDateTime.FromBinaryメソッドで復元する(.NET Framework 2.0以降)。
  6. 現在の日時を表すDateTimeオブジェクトをDateTime.Nowプロパティなどで取得する。(この方法は、「現在の日時を取得する」で説明しています。)

ここでは、DateTimeのコンストラクタを呼び出す方法について説明します。

年月日を指定してDateTimeを作成する

DateTime構造体のコンストラクタに年、月、日をそれぞれ整数で指定して、DateTimeオブジェクトを作成できます。

以下の例では、2000年8月1日を表すDateTimeオブジェクトを作成しています。

VB.NET
コードを隠すコードを選択
'2000年8月1日を表すDateTimeオブジェクトを作成する
Dim dt As New DateTime(2000, 8, 1)
C#
コードを隠すコードを選択
//2000年8月1日を表すDateTimeオブジェクトを作成する
DateTime dt = new DateTime(2000, 8, 1);

年月日と時刻を指定してDateTimeを作成する

上記のように年月日だけを指定してDateTimeを作成すると、時刻は 0時0分0秒 になります。年月日の他に時刻も指定するには、DateTime構造体のコンストラクタに年、月、日、時、分、秒をそれぞれ整数で指定します。

以下の例では、2000年8月1日 13時(午後1時)30分00秒 を表すDateTimeオブジェクトを作成しています。

VB.NET
コードを隠すコードを選択
'2000年8月1日 13時30分00秒 を表すDateTimeオブジェクトを作成する
Dim dt As New DateTime(2000, 8, 1, 13, 30, 0)
C#
コードを隠すコードを選択
//2000年8月1日 13時30分00秒 を表すDateTimeオブジェクトを作成する
DateTime dt = new DateTime(2000, 8, 1, 13, 30, 0);

さらに、ミリ秒まで指定することもできます。ミリ秒は 0〜999 までの整数です。

VB.NET
コードを隠すコードを選択
'2000年8月1日 13時30分00秒500ミリ秒 を表すDateTimeオブジェクトを作成する
Dim dt As New DateTime(2000, 8, 1, 13, 30, 0, 500)
C#
コードを隠すコードを選択
//2000年8月1日 13時30分00秒500ミリ秒 を表すDateTimeオブジェクトを作成する
DateTime dt = new DateTime(2000, 8, 1, 13, 30, 0, 500);

年月日の解釈に使用する暦を指定する

上の例では、指定された年月日はグレゴリオ暦として解釈されます。別の暦として解釈させるには、System.Globalization.Calendarオブジェクトを指定します。

Calendarクラスは抽象クラスであり、.NET Frameworkで用意されているその派生クラスには以下のようなものがあります。なお項目にあるMinSupportedDateTimeとMaxSupportedDateTimeプロパティの値は、そのCalendarがサポートしている最も古い日時と最も新しい日時です。

クラス名 説明 MinSupportedDateTimeプロパティの値 MaxSupportedDateTimeプロパティの値
ChineseLunisolarCalendar 年は中国暦を使用して計算され、日付と月は太陰太陽暦を使用して計算される。EastAsianLunisolarCalendarから派生している。.NET Framework 2.0以降で使用できる。 1901/02/19 0:00:00 2101/01/28 23:59:59
EastAsianLunisolarCalendar 日付が太陽と月の周期に基づいている暦(太陰太陽暦)を表す。抽象クラス。.NET Framework 2.0以降で使用できる。
GregorianCalendar グレゴリオ暦を表す。 0001/01/01 0:00:00 9999/12/31 23:59:59
HebrewCalendar ヘブライ暦を表す。 1583/01/01 0:00:00 2239/09/29 23:59:59
HijriCalendar 回教暦を表す。 0622/07/18 0:00:00 9999/12/31 23:59:59
JapaneseCalendar 和暦を表す。 1868/09/08 0:00:00 9999/12/31 23:59:59
JapaneseLunisolarCalendar 年は和暦として計算され、日付と月は太陰太陽暦(旧暦)を使用して計算される。EastAsianLunisolarCalendarから派生している。.NET Framework 2.0以降で使用できる。 1960/01/28 0:00:00 2050/01/22 23:59:59
JulianCalendar ユリウス暦を表す。 0001/01/01 0:00:00 9999/12/31 23:59:59
KoreanCalendar 韓国暦を表す。 0001/01/01 0:00:00 9999/12/31 23:59:59
KoreanLunisolarCalendar 年はグレゴリオ暦を使用して計算され、日付と月は太陰太陽暦を使用して計算される。EastAsianLunisolarCalendarから派生している。.NET Framework 2.0以降で使用できる。 0918/02/14 0:00:00 2051/02/10 23:59:59
PersianCalendar ペルシャ暦を表す。.NET Framework 2.0以降で使用できる。 0622/03/21 0:00:00 9999/12/31 23:59:59
TaiwanCalendar 台湾暦を表す。 1912/01/01 0:00:00 9999/12/31 23:59:59
TaiwanLunisolarCalendar 台湾太陰太陽暦を表す。EastAsianLunisolarCalendarから派生している。.NET Framework 2.0以降で使用できる。 1912/02/18 0:00:00 2051/02/10 23:59:59
ThaiBuddhistCalendar タイ仏暦を表す。 0001/01/01 0:00:00 9999/12/31 23:59:59
UmAlQuraCalendar サウジ回教暦 (ウムアルクラ暦) を表す。.NET Framework 2.0以降で使用できる。 1900/04/30 0:00:00 2029/05/13 23:59:59

以下に、JapaneseCalendarを使用して平成10年(西暦1998年)8月1日を表すDateTimeオブジェクトを作成する例を示します。

VB.NET
コードを隠すコードを選択
'和暦を表すJapaneseCalendarオブジェクトを作成する
Dim calendar As System.Globalization.Calendar = _
    New System.Globalization.JapaneseCalendar()
'平成10年(西暦1998年)8月1日を表すDateTimeオブジェクトを作成する
Dim dt As New DateTime(10, 8, 1, calendar)
C#
コードを隠すコードを選択
//和暦を表すJapaneseCalendarオブジェクトを作成する
System.Globalization.Calendar calendar =
    new System.Globalization.JapaneseCalendar();
//平成10年(西暦1998年)8月1日を表すDateTimeオブジェクトを作成する
DateTime dt = new DateTime(10, 8, 1, calendar);

タイマ刻み数を指定してDateTimeを作成する

DateTimeのコンストラクタには、西暦1年1月1日0時0分0秒(DateTime.MinValueフィールドの値)からの経過時間をタイマ刻み数で指定する方法も用意されています。

タイマ刻み数は、計測できる最短の時間です。1タイマ刻み数は100ナノ秒(0.0000001秒)で、1秒間のタイマ刻み数は10000000です。この値はTimeSpan構造体の静的フィールドで取得できます。TicksPerMillisecondで1ミリ秒あたり、TicksPerSecondで1秒あたり、TicksPerMinuteで1分あたり、TicksPerHourで1時間あたり、TicksPerDayで1日あたりのタイマ刻み数を取得できます。

DateTimeオブジェクトのタイマ刻み数は、DateTime.Ticksプロパティで取得できます。

実はDateTimeは日時の情報としてはタイマ刻み数しか保持していません。DateTimeにはYear、Month、Dayなど多くのプロパティがありますが、これらのプロパティが返す値はタイマ刻み数から計算された値です。よってDateTime.Ticksプロパティの値だけ覚えていれば、日時を復元することができます(Kindプロパティは復元されません)。

補足:.NET Framework 1.1以前ではDateTimeにKindプロパティがありませんので、タイマ刻み数だけ覚えていればDateTimeを完全に復元できます。.NET Framework 2.0以降では、DateTime.ToBinaryメソッドが返す値(Int64型)を覚えておけば、DateTime.FromBinaryメソッドを使ってDateTimeを完全に復元できます。

次に、タイマ刻み数を指定して10時間後を表すDateTimeを作成する例を示します。

VB.NET
コードを隠すコードを選択
Dim dt1 As New DateTime(2000, 9, 24, 15, 30, 0)

'dt1の10時間後のDateTimeを作成する
Dim dt2 As New DateTime(dt1.Ticks + TimeSpan.TicksPerHour * 10)
'2000/09/25 1:30:00

'タイマ刻み数を使わずに、次のようにしても同じ
Dim dt3 As DateTime = dt1.AddHours(10)
C#
コードを隠すコードを選択
DateTime dt1 = new DateTime(2000, 9, 24, 15, 30, 0);

//dt1の10時間後のDateTimeを作成する
DateTime dt2 = new DateTime(dt1.Ticks + TimeSpan.TicksPerHour * 10);
//2000/09/25 1:30:00

//タイマ刻み数を使わずに、次のようにしても同じ
DateTime dt3 = dt1.AddHours(10);

DateTimeが表す日時が現地時刻かUTCかを設定する

.NET Framework 2.0以降では、DateTimeKind列挙体の値をコンストラクタに渡すことよって、DateTimeオブジェクトが表している日時が現地時刻か、UTCか、どちらか分からないかを設定することができます。この値は、DateTime.Kindプロパティで取得できます。

日時が現地時刻の場合はDateTimeKind.Localを、UTCの場合はDateTimeKind.Utcを、どちらか分からない場合はDateTimeKind.Unspecifiedを指定します。どちらも指定しなかった場合はDateTimeKind.Unspecifiedになります。

Kindプロパティの値によって違いが出るのは、DateTimeを別のタイムゾーンの日時に変換する時です。DateTimeの計算や比較には影響を与えません。DateTimeを別のタイムゾーンの日時に変換する方法は「ローカル時刻を世界協定時刻(UTC)に変換する」で、計算する方法は「日時、時間の計算をする」で説明しています。

次の例では、日時が同じでKindプロパティだけが違う2つのDateTimeオブジェクトを等価演算子で比較すると等しいと判断されることを確認しています。

VB.NET
コードを隠すコードを選択
'現地時間としてDateTimeオブジェクトを作成する
Dim dt1 As New DateTime(2000, 8, 1, 13, 30, 0, DateTimeKind.Local)
'UTCとしてDateTimeオブジェクトを作成する
Dim dt2 As New DateTime(2000, 8, 1, 13, 30, 0, DateTimeKind.Utc)

Console.WriteLine(dt1 = dt2)
'True
C#
コードを隠すコードを選択
//現地時間としてDateTimeオブジェクトを作成する
DateTime dt1 = new DateTime(2000, 8, 1, 13, 30, 0, DateTimeKind.Local);
//UTCとしてDateTimeオブジェクトを作成する
DateTime dt2 = new DateTime(2000, 8, 1, 13, 30, 0, DateTimeKind.Utc);

Console.WriteLine(dt1 == dt2);
//true

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。