方法: コンピューター上に存在するタイム ゾーンを列挙する

指定されたタイム ゾーンを正しく処理するには、そのタイム ゾーンに関する情報がシステムで使用できる必要があります。 Windows XP および Windows Vista オペレーティング システムでは、この情報はレジストリに格納されます。 しかし、世界中に存在するタイム ゾーンの合計数は大きいものの、レジストリにはそれらの一部に関する情報しか含まれません。 さらに、レジストリ自体は、内容が意図的に、および誤って変更される可能性がある動的な構造です。 その結果、アプリケーションは、特定のタイム ゾーンがシステムで定義され、使用できると常に想定することができません。 タイム ゾーン情報のアプリケーションを使用する多くのアプリケーションの最初の手順は、必要なタイム ゾーンがローカル システムで使用できるかどうかを判断する、またはタイム ゾーンの一覧をユーザーに提供して選択させることです。 これには、アプリケーションがローカル システムで定義されているタイム ゾーンを列挙する必要があります。

注意

アプリケーションが、ローカル システムで定義されていない特定のタイム ゾーンの存在に依存している場合は、タイム ゾーンに関する情報をシリアル化および逆シリアル化することによってアプリケーションからその存在を確認できます。 その後、タイム ゾーンをリスト コントロールに追加して、アプリケーション ユーザーが選択できるようにできます。 詳細については、「方法: 埋め込みリソースにタイム ゾーンを保存する」および「方法: 埋め込みリソースからタイム ゾーンを復元する」をご覧ください。

ローカル システムに存在するタイム ゾーンを列挙するには

  1. TimeZoneInfo.GetSystemTimeZones メソッドを呼び出します。 このメソッドから、TimeZoneInfo オブジェクトのジェネリックの ReadOnlyCollection<T> コレクションが返されます。 コレクション内のエントリは、その DisplayName プロパティによって並べ替えられます。 次に例を示します。

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. コレクション内の個々の TimeZoneInfo オブジェクトを列挙するには foreach ループ (C# の場合) または For EachNext ループ (Visual Basic の場合) を使用し、各オブジェクトに対して必要な処理を実行します。 たとえば、次のコードでは、手順 1 で返された TimeZoneInfo オブジェクトの ReadOnlyCollection<T> コレクションを列挙し、各タイム ゾーンの表示名をコンソールに一覧表示します。

    foreach (TimeZoneInfo timeZone in tzCollection)
        Console.WriteLine($"   {timeZone.Id}: {timeZone.DisplayName}");
    
    For Each timeZone As TimeZoneInfo In tzCollection
        Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
    Next
    

ローカル システム上に存在するタイム ゾーンの一覧をユーザーに表示するには

  1. TimeZoneInfo.GetSystemTimeZones メソッドを呼び出します。 このメソッドから、TimeZoneInfo オブジェクトのジェネリックの ReadOnlyCollection<T> コレクションが返されます。

  2. 手順 1 で返されたコレクションを、Windows フォームまたは ASP.NET のリスト コントロールの DataSource プロパティに割り当てます。

  3. ユーザーが選択した TimeZoneInfo オブジェクトを取得します。

Windows アプリケーションの場合の例を次に示します。

この例では、システムで定義されているタイム ゾーンをリスト ボックスに表示する Windows アプリケーションを開始します。 次いでこの例では、ユーザーによって選択されたタイム ゾーン オブジェクトの DisplayName プロパティの値を含むダイアログ ボックスが表示されます。

private void Form1_Load(object sender, EventArgs e)
{
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    _timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
    TimeZoneInfo? selectedTimeZone = (TimeZoneInfo?)_timeZoneList.SelectedItem;
    MessageBox.Show($"You selected the {selectedTimeZone?.ToString()} time zone.");
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo)
    tzCollection = TimeZoneInfo.GetSystemTimeZones()
    Me.timeZoneList.DataSource = tzCollection
End Sub

Private Sub OkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkButton.Click
    Dim selectedTimeZone As TimeZoneInfo = DirectCast(Me.timeZoneList.SelectedItem(), TimeZoneInfo)
    MsgBox("You selected the " & selectedTimeZone.ToString() & " time zone.")
End Sub

ほとんどのリスト コントロール (System.Windows.Forms.ListBox または System.Web.UI.WebControls.BulletedList コントロールなど) では、オブジェクト変数のコレクションをコントロールの DataSource プロパティに割り当てることができます。ただし、そのコレクションが IEnumerable インターフェイスを実装している必要があります。 (ReadOnlyCollection<T> ジェネリック クラスはその一例です)。コレクションの各オブジェクトを表示するため、コントロールでは、そのオブジェクトの ToString メソッドを呼び出して、オブジェクトを表現するために使用する文字列を抽出します。 TimeZoneInfo オブジェクトの場合、ToString メソッドからは TimeZoneInfo オブジェクトの表示名 (その DisplayName プロパティの値) が返されます。

注意

リスト コントロールではオブジェクトの ToString メソッドが呼び出されるため、オブジェクト TimeZoneInfo のコレクションをコントロールに割り当てて、各オブジェクトのわかりやすい名前をコントロールに表示させ、ユーザーが選択した TimeZoneInfo オブジェクトを取得することができます。 これにより、コレクション内の各オブジェクトについて文字列を抽出し、その文字列を別のコレクションに割り当てた後、そのコレクションをコントロールの DataSource プロパティに割り当てて、ユーザーが選択した文字列を取得し、その文字列を使用してそれが表しているオブジェクトを抽出する、という必要がなくなります。

コードのコンパイル

この例で必要な要素は次のとおりです。

関連項目