指定した日時のSystem.DateTimeオブジェクトを作成する方法には、以下のようなものが挙げられます。
ここでは、DateTimeのコンストラクタを呼び出す方法について説明します。
DateTime構造体のコンストラクタに年、月、日をそれぞれ整数で指定して、DateTimeオブジェクトを作成できます。
以下の例では、2000年8月1日を表すDateTimeオブジェクトを作成しています。
'2000年8月1日を表すDateTimeオブジェクトを作成する Dim dt As New DateTime(2000, 8, 1)
//2000年8月1日を表すDateTimeオブジェクトを作成する DateTime dt = new DateTime(2000, 8, 1);
上記のように年月日だけを指定してDateTimeを作成すると、時刻は 0時0分0秒 になります。年月日の他に時刻も指定するには、DateTime構造体のコンストラクタに年、月、日、時、分、秒をそれぞれ整数で指定します。
以下の例では、2000年8月1日 13時(午後1時)30分00秒 を表すDateTimeオブジェクトを作成しています。
'2000年8月1日 13時30分00秒 を表すDateTimeオブジェクトを作成する Dim dt As New DateTime(2000, 8, 1, 13, 30, 0)
//2000年8月1日 13時30分00秒 を表すDateTimeオブジェクトを作成する DateTime dt = new DateTime(2000, 8, 1, 13, 30, 0);
さらに、ミリ秒まで指定することもできます。ミリ秒は 0~999 までの整数です。
'2000年8月1日 13時30分00秒500ミリ秒 を表すDateTimeオブジェクトを作成する Dim dt As New DateTime(2000, 8, 1, 13, 30, 0, 500)
//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オブジェクトを作成する例を示します。
'和暦を表す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)
//和暦を表すJapaneseCalendarオブジェクトを作成する System.Globalization.Calendar calendar = new System.Globalization.JapaneseCalendar(); //平成10年(西暦1998年)8月1日を表すDateTimeオブジェクトを作成する DateTime dt = new DateTime(10, 8, 1, calendar);
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を作成する例を示します。
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)
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);
.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オブジェクトを等価演算子で比較すると等しいと判断されることを確認しています。
'現地時間として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
//現地時間として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
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。