방법: 컴퓨터에 있는 표준 시간대 열거

지정한 표준 시간대를 성공적으로 사용하려면 해당 표준 시간대 관련 정보를 시스템에서 사용할 수 있어야 합니다. 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 EachFor Each…NextNext 반복(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 컨트롤)을 사용하면 해당 컬렉션이 IEnumerable 인터페이스를 구현하는 한 해당 DataSource 속성에 개체 변수 컬렉션을 할당할 수 있습니다. (제네릭 ReadOnlyCollection<T> 클래스는 이 작업을 수행합니다.) 컬렉션에 개별 개체를 표시하기 위해 컨트롤은 해당 개체의 ToString 메서드를 호출하여 개체를 나타내는 데 사용되는 문자열을 추출합니다. TimeZoneInfo 개체의 경우 ToString 메서드는 TimeZoneInfo 개체의 표시 이름(해당 DisplayName 속성 값)을 반환합니다.

참고 항목

목록 컨트롤은 개체의 ToString 메서드를 호출하기 때문에 TimeZoneInfo 개체의 컬렉션을 컨트롤에 할당하고, 컨트롤에 각 개체의 의미 있는 이름을 표시하고, 사용자가 선택한 TimeZoneInfo 개체를 검색할 수 있습니다. 이렇게 하면 컬렉션의 각 개체에 대한 문자열을 추출하고, 컨트롤의 DataSource 속성에 차례로 할당된 컬렉션에 문자열을 할당하고, 사용자가 선택한 문자열을 검색한 다음, 이 문자열을 사용하여 설명하는 개체를 추출할 필요가 없습니다.

코드 컴파일

이 예제에는 다음 사항이 필요합니다.

참고 항목