TimeZoneInfo.AdjustmentRule & TimeZoneInfo.TransitionTime(System.TimeZoneInfo.AdjustmentRule) & (SystemTimeZoneInfo.TransitionTime)
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 |