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

ローカル時刻を世界協定時刻(UTC)に変換する

ここでは、ローカル時刻(現地時刻、現地時間、地方標準時)を世界協定時刻(協定世界時、UTC、Universal Time, Coordinated)に変換する方法と、逆にローカル時刻をUTCに変換する方法を紹介します。また、指定したタイムゾーンのローカル時刻に変換する方法も紹介します。

.NET Framework 3.5以降で、TimeZoneInfoクラスを使用する

.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の変換を行う例を示します。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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"が存在しているものとします。

VB.NET
コードを隠すコードを選択
'フォームの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
C#
コードを隠すコードを選択
//フォームの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以前で、DateTime構造体やTimeZoneクラスを使用する方法

.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をローカル時刻に変換する例をしまします。

VB.NET
コードを隠すコードを選択
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
C#
コードを隠すコードを選択
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の代わりにDateTimeOffsetを使用する方法

DateTimeではなく、.NET Framework 2.0 SP1以降で使用できるDateTimeOffsetオブジェクトの時刻をローカル時刻やUTCへ変換を行う方法は、「DateTimeの代わりにDateTimeOffsetを使用する」の「ローカル時刻やUTCへの変換を行う」で説明しています。

  • 履歴:
  • 2008/7/9 TimeZoneInfoクラスの説明を追加。
  • 2011/10/31 全体的に説明を補充。DateTimeOffsetの説明を追加。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。