[c#] 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));

다음과 같이 출력됩니다.

2010-06-02 오후 4:37:19
2010 년 6 월 2 일 오후 3:37:19 -06 : 00

저는 중부 표준 시간대에 있으며 현재 일광 절약 시간제입니다. 두 번째 줄을 읽으려고합니다.

2010 년 6 월 2 일 오후 4:37:19 -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’을 반환합니다.


답변