ここでは、ローカル時刻(現地時刻、現地時間、地方標準時)を世界協定時刻(協定世界時、UTC、Universal Time, Coordinated)に変換する方法と、逆にローカル時刻をUTCに変換する方法を紹介します。また、指定したタイムゾーンのローカル時刻に変換する方法も紹介します。
.NET Framework 3.5以降では、ローカル時刻をUTCに変換するのにTimeZoneInfo.ConvertTimeToUtcメソッドを、UTCをローカル時刻に変換するのにTimeZoneInfo.ConvertTimeFromUtcメソッドを使用します。
ConvertTimeFromUtcメソッドには2番目のパラメータに変換先のタイムゾーンを指定する必要がありますが、ローカルコンピュータのタイムゾーンであれば、TimeZoneInfo.Localプロパティを指定します。ConvertTimeToUtcメソッドも2番目のパラメータに変換元(変換するDateTime)のタイムゾーンを指定できますが、省略するとローカルコンピュータのタイムゾーンになります。任意のタイムゾーンを指定する方法は、後述します。
ConvertTimeToUtcメソッドは、変換しようとしているDateTimeのKindプロパティがDateTimeKind.Utcの場合は変換しません。ConvertTimeFromUtcメソッドは、変換しようとしているDateTimeのKindプロパティがDateTimeKind.Localの場合は例外ArgumentExceptionをスローします。
ConvertTimeToUtcメソッドが返すDateTimeオブジェクトのKindプロパティは常にUtcになります。ConvertTimeFromUtcメソッドが返すDateTimeオブジェクトのKindプロパティは、2番目のパラメータにTimeZoneInfo.Utcを指定していなければ、Localになります(指定していれば、Utcです)。
以下にこれらのメソッドを使用してローカル時刻(ローカルコンピュータのタイムゾーン)とUTCの変換を行う例を示します。
Dim dt As New DateTime(2000, 9, 24, 15, 30, 0) 'UTCに変換する Dim utcTime As DateTime = System.TimeZoneInfo.ConvertTimeToUtc(dt) '結果を表示する Console.WriteLine("{0} / {1}", utcTime, utcTime.Kind) '2000/09/24 6:30:00 / Utc 'ローカル時刻に変換する Dim localTime As DateTime = _ System.TimeZoneInfo.ConvertTimeFromUtc(utcTime, System.TimeZoneInfo.Local) '結果を表示する Console.WriteLine("{0} / {1}", localTime, localTime.Kind) '2000/09/24 15:30:00 / Local
DateTime dt = new DateTime(2000, 9, 24, 15, 30, 0); //UTCに変換する DateTime utcTime = System.TimeZoneInfo.ConvertTimeToUtc(dt); //結果を表示する Console.WriteLine("{0} / {1}", utcTime, utcTime.Kind); //2000/09/24 6:30:00 / Utc //ローカル時刻に変換する DateTime localTime = System.TimeZoneInfo.ConvertTimeFromUtc(utcTime, System.TimeZoneInfo.Local); //結果を表示する Console.WriteLine("{0} / {1}", localTime, localTime.Kind); //2000/09/24 15:30:00 / Local
あるタイムゾーンの時刻から別のタイムゾーンの時刻に変換するには、いったんUTCに変換するという方法も考えられますが、TimeZoneInfo.ConvertTimeメソッドを使うと一発で出来ます。
ConvertTimeメソッドは変換元のタイムゾーンと変換先のタイムゾーンをTimeZoneInfoオブジェクトで指定します。TimeZoneInfoオブジェクトを取得する方法は「タイムゾーンを取得する」で説明しています。
なお変換元と変換先のタイムゾーンIDが分かっている場合は、TimeZoneInfo.ConvertTimeBySystemTimeZoneIdメソッドを使っても変換できます。
以下の例では、ローカルコンピュータで定義されているタイムゾーンをコンボボックスに表示し、現在のローカル時刻をコンボボックスで選択されたタイムゾーンの時刻に変換しています。なお、フォームにはコンボボックス"ComboBox1"とボタン"Button1"が存在しているものとします。
'フォームのLoadイベントハンドラ Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles MyBase.Load 'コンピュータ上に存在するすべてのタイムゾーンをComboBoxに表示 ComboBox1.DataSource = System.TimeZoneInfo.GetSystemTimeZones() End Sub 'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Button1.Click '現在のローカル時間を取得 Dim nowTime As DateTime = DateTime.Now Console.WriteLine("ローカル日時:{0}", nowTime) '選択されているタイムゾーンの取得 Dim selectedTz As System.TimeZoneInfo = _ CType(ComboBox1.SelectedItem, System.TimeZoneInfo) 'ローカル時間から指定されたタイムゾーンの時間に変換 Dim tzTime As DateTime = System.TimeZoneInfo.ConvertTime( _ nowTime, System.TimeZoneInfo.Local, selectedTz) Console.WriteLine("{0}:{1}", selectedTz.StandardName, tzTime) End Sub
//フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //コンピュータ上に存在するすべてのタイムゾーンをComboBoxに表示 ComboBox1.DataSource = System.TimeZoneInfo.GetSystemTimeZones(); } //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //現在のローカル時間を取得 DateTime nowTime = DateTime.Now; Console.WriteLine("ローカル日時:{0}", nowTime); //選択されているタイムゾーンの取得 System.TimeZoneInfo selectedTz = (System.TimeZoneInfo)ComboBox1.SelectedItem; //ローカル時間から指定されたタイムゾーンの時間に変換 DateTime tzTime = System.TimeZoneInfo.ConvertTime( nowTime, System.TimeZoneInfo.Local, selectedTz); Console.WriteLine("{0}:{1}", selectedTz.StandardName, tzTime); }
.NET Framework 2.0以前でローカル時刻をUTCに変換には、DateTime構造体のToUniversalTimeメソッドを、逆にUTCをローカル時刻に変換するにはToLocalTimeメソッドを使います。
または、TimeZoneクラスのToUniversalTimeとToLocalTimeメソッドを使って変換することもできます。
.NET Framework 2.0からは、変換するDateTimeオブジェクトのKindプロパティによっては変換が行われない可能性があります。ToUniversalTimeメソッドはKindプロパティがUtcのDateTimeを変換しません。ToLocalTimeメソッドはKindプロパティがLocalのDateTimeを変換しません。
ToUniversalTimeメソッドが返すDateTimeのKindプロパティは、Utcになります。ToLocalTimeメソッドが返すDateTimeのKindプロパティは、Localになります。
DateTime構造体やTimeZoneクラスのメソッドを使用した方法は、前述したTimeZoneInfoクラスを使用した方法と違い、現在の調整規則のみが適用されるため、調整規則が実施される前の日時の変換はうまくいきません。TimeZoneInfoクラスは複数の調整規則すべて適用します。
これらのメソッドを使用してローカル時刻をUTCに、UTCをローカル時刻に変換する例をしまします。
Dim dt As New DateTime(2000, 9, 24, 15, 30, 0) 'UTCに変換する Dim utcTime As DateTime = dt.ToUniversalTime() 'または、 Dim utcTime2 As DateTime = System.TimeZone.CurrentTimeZone.ToUniversalTime(dt) '結果を表示する Console.WriteLine("{0} / {1}", utcTime, utcTime.Kind) '2000/09/24 6:30:00 / Utc 'ローカル時刻に変換する Dim localTime As DateTime = utcTime.ToLocalTime() 'または、 Dim localTime2 As DateTime = System.TimeZone.CurrentTimeZone.ToLocalTime(localTime) '結果を表示する Console.WriteLine("{0} / {1}", localTime, localTime.Kind) '2000/09/24 15:30:00 / Local
DateTime dt = new DateTime(2000, 9, 24, 15, 30, 0); //UTCに変換する DateTime utcTime = dt.ToUniversalTime(); //または、 DateTime utcTime2 = System.TimeZone.CurrentTimeZone.ToUniversalTime(dt); //結果を表示する Console.WriteLine("{0} / {1}", utcTime, utcTime.Kind); //2000/09/24 6:30:00 / Utc //ローカル時刻に変換する DateTime localTime = utcTime.ToLocalTime(); //または、 DateTime localTime2 = System.TimeZone.CurrentTimeZone.ToLocalTime(localTime); //結果を表示する Console.WriteLine("{0} / {1}", localTime, localTime.Kind); //2000/09/24 15:30:00 / Local
DateTimeではなく、.NET Framework 2.0 SP1以降で使用できるDateTimeOffsetオブジェクトの時刻をローカル時刻やUTCへ変換を行う方法は、「DateTimeの代わりにDateTimeOffsetを使用する」の「ローカル時刻やUTCへの変換を行う」で説明しています。