본문 바로가기
C#

[C#] TimeZoneInfo

by DANEW 2023. 7. 5.

TimeZoneInfo (System.TimeZoneInfo)

TimeZoneInfo 클래스 (.NET 3.5)

- TimeZone과 비슷한 방식, 더 강력하다

- 세계의 모든 시간대에 관한 정보를 얻을 수 있음

- 일광 절약 시간제에 관해서 좀 더 풍부한 규칙 기반 모형을 제공

 

 

TimeZoneInfo 객체 생성

- TimeZoneInfo.Local, TimeZoneInfo.Utc

- TimeZoneInfo.FindSystemTimeZoneById

 

 

정보 획득

- Id, DisplayName, BaseUtcOffset

- SupportsDaylightSavingTime, IsDaylightSavingTime, IsInvalidTime, IsAmbiguousTime

- GetUtcOffset, GetSystemTimeZones, GetAmbiguousTimeOffsets

 

 

커스텀 시간대 생성

- CreateCustomTimeZone

 

 

직렬화, 역직렬화

- ToSerializedString, FromSerializedString

 

 

시간대 변환

- ConvertTime, ConvertTimeToUtc

 

 

그 밖에...

FindSystemTimeZoneById에 사용되는 ID String을 구하기 위해서 GetSystemTimeZones를 실행하면

  한글로 된 스트링들이 출력된다. 이 스트링은 FindSystemTimeZoneById에 사용할 수 없다.

GetSystemTimeZones을 불변 문화권으로 출력하는 방법이 있을텐데 아직은 모르겠다.

  그래서 이미 출력된 내용을 정리해서 임시로 하단에 넣어두겠다. 윈도우 7 기준이다. 10에서는 더 추가된거 같던데...

 

반응형

 

// TimeZoneInfo 클래스 (.NET 3.5)

// TimeZone과 비슷한 방식으로 작동

// TimeZoneInfo가 더 강력한 기능을 제공

// 1. 세계의 모든 시간대에 관한 정보를 얻을 수 있음

// 2. 일광 절약 시간제에 관해서 좀 더 풍부한 규칙 기반 모형을 제공

 

// 현재 시간대 정보 획득

TimeZoneInfo tziLocal = TimeZoneInfo.Local;

Console.WriteLine(tziLocal.StandardName);   // 해당 지역의 시간대 이름

Console.WriteLine(tziLocal.DaylightName);   // 해당 지역의 일광 절약 시간제 이름

Console.WriteLine();

 

// 일광 절약 시간제 / UTC Offset 정보 획득

// TimeZone과 달리 DateTime DateTimeOffset 모두 사용 가능

DateTime dtNow = DateTime.Now;

DateTimeOffset dtoNow = DateTimeOffset.Now;

 

// 해당 날짜/시간대에서 일광 절약 시간제를 사용중인지 확인

Console.WriteLine(tziLocal.IsDaylightSavingTime(dtoNow));

 

// 해당 날짜/시간대에서 현재 UTC Offset은 얼마인지

Console.WriteLine(tziLocal.GetUtcOffset(dtoNow));

Console.WriteLine();

 

 

// 세계의 특정 시간대에 대한 정보 획득

// 여기에서는 서호주 시간대

TimeZoneInfo tziWA = TimeZoneInfo.FindSystemTimeZoneById("W. Australia Standard Time");

Console.WriteLine(tziWA.Id);    // 해당 지역의 ID

Console.WriteLine(tziWA.DisplayName);       // 시간대 이름 출력

Console.WriteLine(tziWA.BaseUtcOffset);     // 표준 UTC offset 출력

Console.WriteLine(tziWA.SupportsDaylightSavingTime);    // 해당 지역에 일광 절약 시간제 룰이 있는지

Console.WriteLine();

 

 

// 세계의 모든 시간대를 담은 목록 출력하기

foreach (var item in TimeZoneInfo.GetSystemTimeZones())

{

    Console.WriteLine(item);

}

Console.WriteLine();

 

 

// CreateCustomTimeZone을 통해 커스텀 시간대를 만들 수 있으나,

// TimeZoneInfo는 불변이 형식이므로 모든 정보를 한번에 메서드 인수로 넣어줘야 한다.

// 직렬화: ToSerializedString <-> FromSerializedString

 

// TimeZoneInfo을 이용하여

// DateTime -> 로컬 시간대로의 변환

// Local(Unspcified)이나 UTC 시간대에서 tziWA 시간대로 변경.

Console.WriteLine(TimeZoneInfo.ConvertTime(dtNow, tziWA));

 

// dtNow tziLocal 시간대로 취급하여 tziWA로 변경한다.

Console.WriteLine(TimeZoneInfo.ConvertTime(dtNow, tziLocal, tziWA));

Console.WriteLine();

 

 

// DateTime -> UTC 시간대로의 변환

// Local(Unspcified) UTC 시간대로 변경. UTC 시간대인경우 변동은 없다.

Console.WriteLine(dtNow.Kind);

Console.WriteLine(dtNow);

Console.WriteLine(TimeZoneInfo.ConvertTimeToUtc(dtNow));

 

// dtNow tziLocal 시간대로 취급하여 UTC 시간대로 변경한다.

Console.WriteLine(TimeZoneInfo.ConvertTimeToUtc(dtNow, tziLocal));

Console.WriteLine();

 

 

// DateTimeOffSet -> 로컬 시간대로의 변환

// dtoNow tziWA 시간대로 변환

Console.WriteLine(TimeZoneInfo.ConvertTime(dtoNow, tziWA));

Console.WriteLine();

 

 

// InInvalidTime

// 주어진 DateTime이 해당 시간대의 일광 절약 시간제 때문에

// 앞당겨진, 즉 시간선상에서 사라진 시간 구간(delta)에 속하면 true를 돌려준다.

DateTime baseTime = new DateTime(2007, 3, 11, 2, 0, 0);

TimeZoneInfo tziPS = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");

Console.WriteLine(tziPS.IsInvalidTime(baseTime));

 

// IsAmbiguousTime

// 주어진 DateTime이나 DateTimeOffset이 해당 시간대의 일광 절약 시간제 때문에

// 뒤로 돌아간, 즉 되풀이된 시간 구간(delta)에 속하면 true를 돌려준다

baseTime = new DateTime(2007, 11, 4, 1, 0, 0);

Console.WriteLine(tziPS.IsAmbiguousTime(baseTime));

Console.WriteLine();

 

 

// GetAmbiguousTimeOffsets

// 주어진 DateTime이나 DateTimeOffset의 시간이 IsAmbiguousTime true인 경우

// 그에 대해 선택할 수 있는 offset이 담긴 TimeSpan 배열을 돌려준다

TimeSpan[] offsets = tziPS.GetAmbiguousTimeOffsets(baseTime);

 

foreach (var item in offsets)

{

    Console.WriteLine(item);

}

Console.WriteLine();

 

 

반응형

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

[C#] Time​Zone​Info.​Adjustment​Rule & Time​Zone​Info.​Transition​Time  (1) 2023.08.12
[C#] TimeZoneInfo  (1) 2023.08.11
[C#] TimeZone  (1) 2023.08.10
[C#] DateTime & DateTimeOffset  (0) 2023.07.06
[C#] TimeZone  (1) 2023.07.04
[C#] TimeSpan  (1) 2023.07.01
[C#] Encoding  (1) 2023.06.30
[C#] StringBuilder  (0) 2023.06.27