다음을 통해 공유


방법: 조정 규칙을 사용하여 표준 시간대 만들기

업데이트: 2007년 11월

응용 프로그램에 필요한 정확한 표준 시간대 정보가 다음과 같은 몇 가지 원인 때문에 특정 시스템에 없을 수 있습니다.

  • 로컬 시스템의 레지스트리에서 표준 시간대를 정의하지 않았습니다.

  • 레지스트리에서 표준 시간대에 대한 데이터를 수정하거나 제거했습니다.

  • 중요한 특정 기간 동안의 표준 시간대 조정에 대한 정확한 정보가 표준 시간대에 없습니다.

이러한 경우 CreateCustomTimeZone 메서드를 호출하여 응용 프로그램에 필요한 표준 시간대를 정의할 수 있습니다. 이 메서드의 오버로드를 사용하면 조정 규칙을 사용하거나 사용하지 않고 표준 시간대를 만들 수 있습니다. 표준 시간대에서 일광 절약 시간을 지원하는 경우 고정 조정 규칙이나 유동 조정 규칙을 사용하여 조정을 정의할 수 있습니다. 이러한 용어에 대한 정의는 표준 시간대 개요에서 "표준 시간대 용어" 단원을 참조하십시오.

중요:

CreateCustomTimeZone 메서드를 호출하여 만든 사용자 지정 표준 시간대는 레지스트리에 추가되지 않습니다. 대신 CreateCustomTimeZone 메서드 호출에서 반환되는 개체 참조를 통해서만 이러한 표준 시간대에 액세스할 수 있습니다.

이 항목에서는 조정 규칙을 사용하여 표준 시간대를 만드는 방법을 보여 줍니다. 일광 절약 시간 조정 규칙을 지원하지 않는 표준 시간대를 만들려면 방법: 조정 규칙을 사용하지 않고 표준 시간대 만들기를 참조하십시오.

유동 조정 규칙을 사용하여 표준 시간대를 만들려면

  1. 각 조정에 대해 즉, 특정 시간 간격으로 반복되는 표준 시간에서 또는 표준 시간으로의 각 전환에 대해 다음을 수행합니다.

    1. 표준 시간대 조정에 대한 시작 전환 시간을 정의합니다.

      TimeZoneInfo.TransitionTime.CreateFloatingDateRule 메서드를 호출하고 전환 시간을 정의하는 DateTime 값, 전환이 발생하는 월을 정의하는 정수 값, 전환이 발생하는 주를 정의하는 정수 값 및 전환이 발생하는 요일을 정의하는 DayOfWeek 값을 이 메서드에 전달해야 합니다. 이 메서드 호출에서는 TimeZoneInfo.TransitionTime 개체가 인스턴스화됩니다.

    2. 표준 시간대 조정에 대한 종료 전환 시간을 정의합니다. 이를 위해서는 TimeZoneInfo.TransitionTime.CreateFloatingDateRule 메서드를 또 한번 호출해야 합니다. 이 메서드 호출에서는 두 번째 TimeZoneInfo.TransitionTime 개체가 인스턴스화됩니다.

    3. CreateAdjustmentRule 메서드를 호출하고 조정의 유효한 시작 날짜 및 종료 날짜, 전환에 걸리는 시간을 정의하는 TimeSpan 개체 및 특정 시간대에서 일광 절약 시간 사이의 전환이 이루어지는 시기를 정의하는 두 개의 TimeZoneInfo.TransitionTime 개체를 이 메서드에 전달합니다. 이 메서드 호출에서는 TimeZoneInfo.AdjustmentRule 개체가 인스턴스화됩니다.

    4. TimeZoneInfo.AdjustmentRule 개체를 TimeZoneInfo.AdjustmentRule 개체의 배열에 할당합니다.

  2. 표준 시간대의 표시 이름을 정의합니다. 표시 이름은 표준 시간대의 UTC(협정 세계시) 오프셋을 괄호로 묶고 그 뒤에 표준 시간대를 식별하는 문자열, 해당 표준 시간대 내에 있는 하나 이상의 도시 또는 하나 이상의 국가나 지역이 오는 일반적인 형식을 따릅니다.

  3. 표준 시간대 표준 시간의 이름을 정의합니다. 일반적으로 이 문자열은 표준 시간대의 식별자로도 사용됩니다.

  4. 표준 시간대 일광 절약 시간의 이름을 정의합니다.

  5. 표준 시간대의 표준 이름과 다른 식별자를 사용하려면 표준 시간대 식별자를 정의합니다.

  6. 표준 시간대의 UTC 오프셋을 정의하는 TimeSpan 개체를 인스턴스화합니다. 시간이 UTC보다 늦은 표준 시간대의 오프셋은 양수이고 UTC보다 이른 표준 시간대의 오프셋은 음수입니다.

  7. TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, array<TimeZoneInfo.AdjustmentRule[]) 메서드를 호출하여 새 표준 시간대를 인스턴스화합니다.

예제

다음 예제에서는 1918년에서 현재 사이의 여러 시간 간격에 대한 조정 규칙이 포함된 미국의 중부 표준시를 정의합니다.

Dim cst As TimeZoneInfo
' Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
Dim delta As New TimeSpan(1, 0, 0)
Dim adjustment As TimeZoneInfo.AdjustmentRule
Dim adjustmentList As New List(Of TimeZoneInfo.AdjustmentRule)
' Declare transition time variables to hold transition time information
Dim transitionRuleStart, transitionRuleEnd As TimeZoneInfo.TransitionTime

' Define new Central Standard Time zone 6 hours earlier than UTC
' Define rule 1 (for 1918-1919)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 03, 05, DayOfWeek.Sunday)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 10, 05, DayOfWeek.Sunday) 
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1918#, #12/31/1919#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment) 
' Define rule 2 (for 1942)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 02, 09)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1942#, #12/31/1942#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 3 (for 1945)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#11:00:00PM#, 08, 14)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 09, 30)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1945#, #12/31/1945#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define end rule (for 1967-2006)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#02:00:00AM#, 10, 5, DayOfWeek.Sunday)
' Define rule 4 (for 1967-73)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1967#, #12/31/1973#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 5 (for 1974 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 01, 06)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1974#, #12/31/1974#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 6 (for 1975 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(#2:00:00AM#, 02, 23)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1975#, #12/31/1975#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 7 (1976-1986)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 05, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1976#, #12/31/1986#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 8 (1987-2006)  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 04, 01, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/1987#, #12/31/2006#, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)
' Define rule 9 (2007- )  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 03, 02, DayOfWeek.Sunday)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(#2:00:00AM#, 11, 01, DayOfWeek.Sunday)
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(#01/01/2007#, Date.MaxValue.Date, delta, transitionRuleStart, transitionRuleEnd)
adjustmentList.Add(adjustment)

' Convert list of adjustment rules to an array
Dim adjustments(adjustmentList.Count - 1) As TimeZoneInfo.AdjustmentRule
adjustmentList.CopyTo(adjustments)

cst = TimeZoneInfo.CreateCustomTimeZone("Central Standard Time", New TimeSpan(-6, 0, 0), _
      "(GMT-06:00) Central Time (US Only)", "Central Standard Time", _
      "Central Daylight Time", adjustments)
TimeZoneInfo cst;
// Declare necessary TimeZoneInfo.AdjustmentRule objects for time zone
TimeSpan delta = new TimeSpan(1, 0, 0);
TimeZoneInfo.AdjustmentRule adjustment;
List<TimeZoneInfo.AdjustmentRule> adjustmentList = new List<TimeZoneInfo.AdjustmentRule>();
// Declare transition time variables to hold transition time information
TimeZoneInfo.TransitionTime transitionRuleStart, transitionRuleEnd;

// Define new Central Standard Time zone 6 hours earlier than UTC
// Define rule 1 (for 1918-1919)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 05, DayOfWeek.Sunday);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 05, DayOfWeek.Sunday); 
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1918, 1, 1), new DateTime(1919, 12, 31), delta, 
                                                           transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment); 
// Define rule 2 (for 1942)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 02, 09);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1942, 1, 1), new DateTime(1942, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 3 (for 1945)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 23, 0, 0), 08, 14);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 09, 30);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1945, 1, 1), new DateTime(1945, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define end rule (for 1967-2006)
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 10, 5, DayOfWeek.Sunday);
// Define rule 4 (for 1967-73)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1967, 1, 1), new DateTime(1973, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 5 (for 1974 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 01, 06);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1974, 1, 1), new DateTime(1974, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 6 (for 1975 only)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFixedDateRule(new DateTime(1, 1, 1, 2, 0, 0), 02, 23);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1975, 1, 1), new DateTime(1975, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 7 (1976-1986)
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 05, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1976, 1, 1), new DateTime(1986, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 8 (1987-2006)  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 04, 01, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(1987, 1, 1), new DateTime(2006, 12, 31), 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);
// Define rule 9 (2007- )  
transitionRuleStart = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 03, 02, DayOfWeek.Sunday);
transitionRuleEnd = TimeZoneInfo.TransitionTime.CreateFloatingDateRule(new DateTime(1, 1, 1, 2, 0, 0), 11, 01, DayOfWeek.Sunday);
adjustment = TimeZoneInfo.AdjustmentRule.CreateAdjustmentRule(new DateTime(2007, 1, 1), DateTime.MaxValue.Date, 
                                                           delta, transitionRuleStart, transitionRuleEnd);
adjustmentList.Add(adjustment);

// Convert list of adjustment rules to an array
TimeZoneInfo.AdjustmentRule[] adjustments = new TimeZoneInfo.AdjustmentRule[adjustmentList.Count];
adjustmentList.CopyTo(adjustments);

cst = TimeZoneInfo.CreateCustomTimeZone("Central Standard Time", new TimeSpan(-6, 0, 0), 
      "(GMT-06:00) Central Time (US Only)", "Central Standard Time", 
      "Central Daylight Time", adjustments);

이 예제에서 만드는 표준 시간대에는 여러 조정 규칙이 포함됩니다. 조정 규칙의 유효한 시작 및 종료 날짜가 다른 조정 규칙의 날짜와 겹치지 않도록 주의를 기울여야 합니다. 겹치는 경우 InvalidTimeZoneException이 throw됩니다.

유동 조정 규칙의 경우 값 5를 CreateFloatingDateRule 메서드의 week 매개 변수로 전달하여 전환이 특정 월의 마지막 주에 발생하도록 지정합니다.

TimeZoneInfo.CreateCustomTimeZone(String, TimeSpan, String, String, String, array<TimeZoneInfo.AdjustmentRule[]) 메서드 호출에서 사용할 TimeZoneInfo.AdjustmentRule 개체의 배열을 만들 때 코드에서 표준 시간대에 대해 만들 조정의 수에 필요한 크기로 해당 배열을 초기화할 수 있습니다. 대신 이 코드에서는 Add 메서드를 호출하여 각 조정 규칙을 TimeZoneInfo.AdjustmentRule 개체의 제네릭 List<T> 컬렉션에 추가합니다. 그런 다음 CopyTo 메서드를 호출하여 이 컬렉션의 멤버를 배열에 복사합니다.

또한 이 예제에서는 CreateFixedDateRule 메서드를 사용하여 고정 날짜 조정을 정의합니다. 이는 전환 매개 변수 중 시간, 월 및 요일만 필요하다는 점만 제외하면 CreateFloatingDateRule 메서드를 호출하는 것과 유사합니다.

다음과 같은 코드를 사용하여 이 예제를 테스트할 수 있습니다.

Dim est As TimeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

Dim pastDate1 As Date = #2/11/1942#
Console.WriteLine("Is {0} daylight saving time: {1}", pastDate1, _
                  cst.IsDaylightSavingTime(pastDate1))

Dim pastDate2 As Date = #10/29/1967 1:30AM#
Console.WriteLine("Is {0} ambiguous: {1}", pastDate2, _
                  cst.IsAmbiguousTime(pastDate2))

Dim pastDate3 As Date = #1/7/1974 2:59AM#
Console.WriteLine("{0} {1} is {2} {3}", pastDate3, _
                  IIf(est.IsDaylightSavingTime(pastDate3), _
                      est.DaylightName, est.StandardName), _
                  TimeZoneInfo.ConvertTime(pastDate3, est, cst), _ 
                  IIf(cst.IsDaylightSavingTime(TimeZoneInfo.ConvertTime(pastDate3, est, cst)), _
                      cst.DaylightName, cst.StandardName)) 
'
' This code produces the following output to the console:
' 
'    Is 2/11/1942 12:00:00 AM daylight saving time: True
'    Is 10/29/1967 1:30:00 AM ambiguous: True
'    1/7/1974 2:59:00 AM Eastern Standard Time is 1/7/1974 2:59:00 AM Central Daylight Time                            
TimeZoneInfo est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

DateTime pastDate1 = new DateTime(1942, 2, 11);
Console.WriteLine("Is {0} daylight saving time: {1}", pastDate1, 
                  cst.IsDaylightSavingTime(pastDate1));

DateTime pastDate2 = new DateTime(1967, 10, 29, 1, 30, 00);
Console.WriteLine("Is {0} ambiguous: {1}", pastDate2, 
                  cst.IsAmbiguousTime(pastDate2));

DateTime pastDate3 = new DateTime(1974, 1, 7, 2, 59, 00);
Console.WriteLine("{0} {1} is {2} {3}", pastDate3, 
                  est.IsDaylightSavingTime(pastDate3) ? 
                      est.DaylightName : est.StandardName, 
                  TimeZoneInfo.ConvertTime(pastDate3, est, cst),  
                  cst.IsDaylightSavingTime(TimeZoneInfo.ConvertTime(pastDate3, est, cst)) ?
                      cst.DaylightName : cst.StandardName);
//
// This code produces the following output to the console:
// 
//    Is 2/11/1942 12:00:00 AM daylight saving time: True
//    Is 10/29/1967 1:30:00 AM ambiguous: True
//    1/7/1974 2:59:00 AM Eastern Standard Time is 1/7/1974 2:59:00 AM Central Daylight Time                            

코드 컴파일

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

  • System.Core.dll에 대한 참조를 프로젝트에 추가해야 합니다.

  • 다음 네임스페이스를 가져와야 합니다.

    Imports System.Collections.Generic
    Imports System.Collections.ObjectModel
    
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    

참고 항목

작업

방법: 조정 규칙을 사용하지 않고 표준 시간대 만들기

개념

표준 시간대 개요

기타 리소스

시간 및 표준 시간대