方法 : コンピュータ上に存在するタイム ゾーンを列挙する
更新 : 2007 年 11 月
指定されたタイム ゾーンを正しく処理するには、システムで使用できるタイム ゾーンについての情報が必要です。Windows XP オペレーティング システムと Windows Vista オペレーティング システムは、この情報をレジストリに格納します。しかし、世界中に存在するタイム ゾーンの総数は多く、レジストリに含まれている情報はそのサブセットにすぎません。さらに、レジストリ自体が動的な構造であり、その内容は意図的に、または偶然に変更される可能性があります。そのため、アプリケーションでは、特定のタイム ゾーンがシステム上に定義されていて使用できるものと常に想定することはできません。タイム ゾーン情報を使用する多くのアプリケーションでは、最初の手順として、必要なタイム ゾーンがローカル システムで使用できることを確認するか、またはタイム ゾーンの一覧をユーザーに表示して選択を促します。そのためには、ローカル システムで定義されているタイム ゾーンをアプリケーションで列挙する必要があります。
メモ : |
---|
ローカル システムで定義されていない可能性のある特定のタイム ゾーンの存在に依存するアプリケーションは、そのタイム ゾーンに関する情報をシリアル化および逆シリアル化することで、タイム ゾーンを確実に存在させることができます。その後、タイム ゾーンをリスト コントロールに追加して、アプリケーションのユーザーが選択できるようにします。詳細については、「方法 : 埋め込みリソースにタイム ゾーンを保存する」および「方法 : 埋め込みリソースからタイム ゾーンを復元する」を参照してください。 |
ローカル システムに存在するタイム ゾーンを列挙するには
TimeZoneInfo.GetSystemTimeZones メソッドを呼び出します。メソッドは、TimeZoneInfo オブジェクトのジェネリック ReadOnlyCollection<T> コレクションを返します。コレクションのエントリは、DisplayName プロパティの順に並んでいます。次に例を示します。
Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
ReadOnlyCollection<TimeZoneInfo> tzCollection; tzCollection = TimeZoneInfo.GetSystemTimeZones();
foreach ループ (C# の場合) または For Each...Next ループ (Visual Basic の場合) を使用して、コレクション内の個々の TimeZoneInfo オブジェクトを列挙し、各オブジェクトに対して必要な処理を実行します。たとえば、次の例では、手順 1. で返された TimeZoneInfo オブジェクトの ReadOnlyCollection<T> コレクションを列挙し、各タイム ゾーンの表示名の一覧をコンソールに表示します。
For Each timeZone As TimeZoneInfo In tzCollection Console.WriteLine(" {0}: {1}", timeZone.Id, timeZone.DisplayName) Next
foreach (TimeZoneInfo timeZone in tzCollection) Console.WriteLine(" {0}: {1}", timeZone.Id, timeZone.DisplayName);
ローカル システムに存在するタイム ゾーンの一覧をユーザーに表示するには
TimeZoneInfo.GetSystemTimeZones メソッドを呼び出します。メソッドは、TimeZoneInfo オブジェクトのジェネリック ReadOnlyCollection<T> コレクションを返します。
手順 1. で返されたコレクションを、Windows フォームの DataSource プロパティまたは ASP.NET のリスト コントロールに割り当てます。
ユーザーが選択した TimeZoneInfo オブジェクトを取得します。
Windows アプリケーションでの例を次に示します。
使用例
この例は、システムで定義されているタイム ゾーンをリスト ボックスに表示する Windows アプリケーションを起動します。次に、ユーザーが選択したタイム ゾーン オブジェクトの DisplayName プロパティの値を含むダイアログ ボックスを表示します。
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
private void Form1_Load(object sender, EventArgs e)
{
ReadOnlyCollection<TimeZoneInfo> tzCollection;
tzCollection = TimeZoneInfo.GetSystemTimeZones();
this.timeZoneList.DataSource = tzCollection;
}
private void OkButton_Click(object sender, EventArgs e)
{
TimeZoneInfo selectedTimeZone = (TimeZoneInfo) this.timeZoneList.SelectedItem;
MessageBox.Show("You selected the " + selectedTimeZone.ToString() + " time zone.");
}
ほとんどのリスト コントロール (System.Windows.Forms.ListBox コントロールや System.Web.UI.WebControls.BulletedList コントロールなど) では、コレクションが IEnumerable インターフェイスを実装していれば、オブジェクト変数のコレクションを DataSource プロパティに割り当てることができます (ジェネリック ReadOnlyCollection<T> クラスはこれを実装しています)。コレクション内の個々のオブジェクトを表示するために、コントロールはオブジェクトの ToString メソッドを呼び出して、オブジェクトを表すために使用される文字列を抽出します。TimeZoneInfo オブジェクトの場合、ToString メソッドは TimeZoneInfo オブジェクトの表示名 (DisplayName プロパティの値) を返します。
メモ : |
---|
リスト コントロールはオブジェクトの ToString メソッドを呼び出すので、コントロールに TimeZoneInfo オブジェクトのコレクションを割り当てて、各オブジェクトの意味のある名前を表示させることができます。さらに、ユーザーが選択した TimeZoneInfo オブジェクトも取得できます。これにより、コレクション内の各オブジェクトの文字列を抽出し、文字列をコレクションに割り当て、そのコレクションをコントロールの DataSource プロパティに割り当て、ユーザーが選択した文字列を取得し、その文字列を使用して対象のオブジェクトを抽出するという手間をかける必要がなくなります。 |
コードのコンパイル方法
この例で必要な要素は次のとおりです。
System.Core.dll への参照をプロジェクトに追加する。
次の名前空間をインポートする。
System (C# コードの場合)