본문 바로가기
C#

[C#] Time​Zone​Info.​Adjustment​Rule & Time​Zone​Info.​Transition​Time

by DANEW 2023. 8. 12.

Time​Zone​Info.​Adjustment​Rule & Time​Zone​Info.​Transition​Time(System.Time​Zone​Info.​Adjustment​Rule) & (SystemTime​Zone​Info.​Transition​Time)

 

TimeZoneInfo.AdjustmentRule Class (System)

Provides information about a time zone adjustment, such as the transition to and from daylight saving time.

learn.microsoft.com

public sealed class TimeZoneInfo.AdjustmentRule : IEquatable<TimeZoneInfo.AdjustmentRule>, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable
 

TimeZoneInfo.TransitionTime Struct (System)

Provides information about a specific time change, such as the change from daylight saving time to standard time or vice versa, in a particular time zone.

learn.microsoft.com

public struct TimeZoneInfo.TransitionTime : IEquatable<TimeZoneInfo.TransitionTime>, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable

 

 

TimeZoneInfo.AdjustmentRule의 생성

- TimeZoneInfo.GetAdjustmentRules

- CreateAdjustmentRule

 

 

Rule에 대한 정보 획득

- DateStart, DateEnd

 * 룰의 범위를 표시하지만 실제 일광 절약 시간제의 적용 시간은 해당 시간을 넘어설 수도 있다.

- DaylightDelta

 

 

전이 시간(Transition Time)에 대한 정보 획득

- DaylightTransitionStart, DaylightTransitionEnd

 

 

 

TimeZoneInfo.TransitionTime의 생성

- TimeZoneInfo.AdjustmentRule 생성시 멤버로 생성

- CreateFixedDateRule, CreateFloatingDateRule

 

 

전이 시간의 구성

1. 고정된 날짜(Fixed-Date Rule): Month, Day, TimeOfDay

2. 유동적인 날짜(Fixed-Date Rule): Month, Week, DayOfWeek, TimeOfDay

IsFixedDateRule을 통해 확인 가능

 

반응형

그 밖에...

- 전이 시간에 관련된 내용이 책과 많이 다르다. 정보가 변한듯?

- 고정된 날짜 서식을 실제로 사용하는것은 없다. 죄다 유동적인 날짜를 사용하고 있다.

 * 있다면 다 1월 1일의 실행하지 않았다는 무의미한 값이다.

 * 어차피 해당 년도에 일광 절약 시간제를 사용을 안 했다는건데, 이를 기록하는게 의미가 있을까?

 * 또한 1월 1일의 경우 시작 전이 시간 틱값은 0이고, 끝날때의 전이 시간 틱값은 10000이다. 이건 또 왜?

 

 

static void Main(string[] args)

{

    // 예카테린부르크 시간대

    TimeZoneInfo tziE = TimeZoneInfo.FindSystemTimeZoneById("Ekaterinburg Standard Time");

 

    // GetAdjustmentRules - TimeZoneInfo.AdjustmentRule[]

    // 모든 해에 적용되는 모든 선언적 시간 조정 규칙을 나타내는 객체 받기

    TimeZoneInfo.AdjustmentRule[] AdRuleWA = tziE.GetAdjustmentRules();

 

    // 각 년도에 대해서

    foreach (var item in AdRuleWA)

    {

        // 룰의 시작과 끝을 표시

 

        // 룰의 시작과 끝과 실 일광 절약 시간제 적용 시간은 다를 수 있다.        

        

        // 서호주의 경우,

        // 룰의 범위는 2006-01-01 ~ 2006-12-31로 표시된다.

        // 해당 정보의 일광 절약 시간제 사용은 2006 12 ~ 2007 1월이었다.

        Console.WriteLine($" Rule: applies from {item.DateStart} to {item.DateEnd}");

 

        // 일광 절약 시간제로 인한 시간의 변동량, Delta를 표시

        Console.WriteLine($"Delta: {item.DaylightDelta}");

 

        // 시작 시간 표시

        Console.WriteLine($"Start: {FormatTransitionTime(item.DaylightTransitionStart)}");

 

        // 종료 시간 표시

        Console.WriteLine($"  End: {FormatTransitionTime(item.DaylightTransitionEnd)}");

 

        Console.WriteLine();

    }

}

 

// DaylightTransitionStart, DaylightTransitionEnd

// TimeZoneInfo.TransitionTime

 

// 전이 시간(표준시간 <-> 일광절약시간 변하는 해당 시간)

// 고정된 날짜 혹은 유동적인 날짜를 통해 표현된다.

// IsFixedDateRule로 표현 형식을 판단 할 수 있다.

        

// 고정된 날짜(Fixed-Date Rule): Month, Day, TimeOfDay

 

// 유동적인 날짜(Fixed-Date Rule): Month, Week, DayOfWeek, TimeOfDay

static string FormatTransitionTime(TimeZoneInfo.TransitionTime tt)

{

    // 해당 해에서 일광 절약 시간제가 시작하거나 끝나지 않는 경우는 아래 조건을 모두 만족

    // 1. 고정된 날짜 설정

    // 2. 1 1

    // 3. TimeOfDay의 틱 수가 0이거나(start의 경우) / 10000인 경우(end의 경우)

    //  * TimeOfDay의 틱이 왜 1만이 되는지는 잘 모르겠음...

    if (tt.IsFixedDateRule && tt.Day == 1 && tt.Month == 1 &&

       (tt.TimeOfDay.Ticks == 0 || tt.TimeOfDay.Ticks == 10000))  

    {

        return "-";

    }

 

    string s;

 

    // 고정된 날짜 룰인 경우

    // 그런데 정보가 바뀐건지 모든 리스트에서 고정 날짜가 하나도 없다 - 테스트를 못 해봄

    // 월도 없고 날짜만 달랑 있는데...

    if (tt.IsFixedDateRule)

    {     

        // 해당 날짜를 돌려준다

        return s = tt.Day.ToString();

    }

 

    // 유동적인 날짜 룰인 경우

    else

    {

        // 각 월의 영문명 얻어오기 (System.Globalization)

        // 날짜 정보 - 불변 문화권 - 월 이름

        string months = DateTimeFormatInfo.InvariantInfo.MonthNames[tt.Month - 1];

        string weeks = "first second third fourth last".Split()[tt.Week - 1];

 

        // tt에 대한 TimeOfDay: 시간의 변경이 발생한 시간, 초를 가져옴

        // tt.TimeOfDay에 대한 TimeOfDay: 자정으로부터 얼마나 시간이 지났는지 TimeSpan으로 표현해줌

        return s = $"The {weeks} at {tt.DayOfWeek} in {months} at {tt.TimeOfDay.TimeOfDay}";

    }

}

반응형

'C#' 카테고리의 다른 글

[C#] XmlConvert  (1) 2023.08.16
[C#] Convert  (2) 2023.08.15
[C#] 서식화(Formatting)와 파싱(Parsing)  (1) 2023.08.14
[C#] 표준 서식 문자열과 파싱 플래그  (1) 2023.08.13
[C#] TimeZoneInfo  (1) 2023.08.11
[C#] TimeZone  (1) 2023.08.10
[C#] DateTime & DateTimeOffset  (0) 2023.07.06
[C#] TimeZoneInfo  (2) 2023.07.05