TimeZoneInfo를 사용하여 일광 절약 시간 동안 현지 시간을 얻는 방법은 무엇입니까?
DateTimeOffset을 사용하여 모든 시간대에 특정 시간을 전달하려고합니다. TimeZoneInfo를 사용하여 일광 절약 시간을 처리하는 방법을 알 수 없습니다.
var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());
var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.BaseUtcOffset));
다음과 같이 출력됩니다.
6/2/2010 4:37:19 PM
6/2/2010 3:37:19 PM -06:00
저는 중부 표준 시간대에 있으며 현재 일광 절약 시간제에 있습니다. 두 번째 줄을 읽으려고합니다.
6/2/2010 4:37:19 PM -05:00
BaseUtcOffset은 분명히 DST를 기반으로 변경되지 않습니다.
적절한 오프셋 값으로 적절한 시간을 어떻게 얻을 수 있습니까?
TimeZoneInfo에서 UtcOffset을 가져온 다음 ToOffset () 메서드에 전달해야합니다.
var dt = DateTime.UtcNow;
Console.WriteLine(dt.ToLocalTime());
var tz = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero);
Console.WriteLine(utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)));
일광 절약 시간을 허용하는 TimeZoneInfo.ConvertTimeFromUtc를 사용할 수도 있습니다.
DateTime utc = DateTime.UtcNow;
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time");
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(utc, zone);
또는 시간대 식별자 를 하드 코딩하지 않으려면 다음과 같이하십시오.
TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById(TimeZoneInfo.Local.Id);
DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzi);
저는 .NET과 stackoverflow의 초보자이므로 틀릴 수 있지만 여기에 있습니다.
TimeZoneInfo.ConvertTimeFromUtc를 사용하면 일광 절약 시간이 허용되며 시간대 + 가능한 DST 오프셋에 따라 올바른 시간으로 변환됩니다. 그러나 결과 개체의 오프셋 자체는 표준 시간에 대한 오프셋을 표시하며 일광 절약 시간을 고려하지 않습니다. 따라서 객체에 ToString을 수행하려는 경우 올바른 시간 (시간 및 분)이 표시되지만 일광 절약 시간 동안 잘못된 오프셋이 발생하여 나중에 코드에서 잘못된 시간으로 이어질 수 있습니다.
대신 GetUtcOffset을 사용하여 특정 시간에 대한 오프셋을 가져온 다음 DateTimeOffset 개체에서 ToOffset을 수행하면시 / 분 및 오프셋 자체가 모두 올바르게 변환되고 ToString을 안전하게 수행 할 수 있습니다.
string ExpectedDateTimePattern = "yyyy'-'MM'-'dd'T'HH':'mm':'ss''zzz";
string timeZoneId = "FLE Standard Time";
string dateTimestr = "2017-10-09T09:00:00+02:00";
DateTimeOffset dto = DateTimeOffset.Parse(dateTimeStr);
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
TimeSpan offset = zone.GetUtcOffset(dto);
dto = dto.ToOffset(offset);
string localTime = dto.ToString(ExpectedDateTimePattern);
localTime은 '2017-10-09T10 : 00 : 00 + 03 : 00'을 반환합니다.
'Program Tip' 카테고리의 다른 글
표준 Windows .ini 파일이 주석을 허용합니까? (0) | 2020.10.12 |
---|---|
SQL Server 2008 빈 문자열 대 공백 (0) | 2020.10.12 |
프로그래머가 "객체가 아닌 인터페이스에 대한 코드"라는 말은 무엇을 의미합니까? (0) | 2020.10.12 |
32 비트 및 64 비트 용으로 컴파일 할 때 큰 성능 차이 (26 배 더 빠름) (0) | 2020.10.12 |
Swift @escaping 및 완료 처리기 (0) | 2020.10.12 |