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#] Convert (2) | 2023.08.15 |
---|---|
[C#] 서식화(Formatting)와 파싱(Parsing) (1) | 2023.08.14 |
[C#] 표준 서식 문자열과 파싱 플래그 (1) | 2023.08.13 |
[C#] TimeZoneInfo.AdjustmentRule & TimeZoneInfo.TransitionTime (1) | 2023.08.12 |
[C#] TimeZone (1) | 2023.08.10 |
[C#] DateTime & DateTimeOffset (0) | 2023.07.06 |
[C#] TimeZoneInfo (2) | 2023.07.05 |
[C#] TimeZone (1) | 2023.07.04 |