2014-04-01 2 views
0

주어진 국가/지역이 TimeZoneInfo 클래스를 사용하여 일광 절약 시간을 지원하는지 여부를 지정하는 방법은 없습니다. 내가 생각할 수있는 유일한 일에 대해일광 절약 시간제가 적용되지 않은 국가의 TimeZoneInfo 변환 처리 푸에르토 리코 및 일부 다른 국가에서는 일광 절약 시간제가 없습니다.

DateTime dt = DateTime.UtcNow;   
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Atlantic Standard Time"); 
if (tz.IsDaylightSavingTime(dt)) 
    Console.WriteLine("Daylight Savings"); 

는 사용자가 일광 절약을 위해 조정하고 대신 더 직접적인 TimeZoneInfo.ConvertTimeFromUtc 방법의 TimeZoneInfo.GetUtcOffset 사용 여부 또한 시간대 모두를 지정할 수 있도록하는 것입니다 .

if (tz.IsDaylightSavingTime(dt) && !supportsDaylightSaving) 
    { 
     var utcOffset = new DateTimeOffset(dt, TimeSpan.Zero).AddHours(-1); 
     var dt3 = utcOffset.ToOffset(tz.GetUtcOffset(utcOffset)).DateTime; 
     Console.WriteLine(dt3); 
    } 

다른 방법을 고려해 볼까요? 위의 방법에 대해 나쁜 점이 있습니까?

+0

DST 적합성은 지방의 정치적 결정입니다. 미국의 많은 다른 로케일을 따르지 않는 지역, 아메리칸 인디언 부족의 토지, 인디애나 및 애리조나의 카운티 등. 그런 지역의 로컬 PC 만이 사실을 알고 있습니다. TimeZoneInfo는 최상의 추측을 제공합니다. 이러한 종류의 함정을 피하려면 항상 UTC를 사용하십시오. –

+0

합의 100 %, 한스 (Hans)이며 데이터는 UTC로 저장됩니다. 그러나 전시를 위해서는 현지 시간을 표시해야합니다. 나는 위에서 설명한 접근 방식이 사용자가 예외적 인 경우에 대해 알려주도록하기 때문에 최선의 방법이라고 생각하기 시작했습니다. (응용 프로그램은 MVC 응용 프로그램이므로 "Local"은 서버가 좋지 않습니다. 내가 참조 할 시간대). – danmiser

+0

로컬 PC에 현지 시간을 표시하는 것이 결코 문제가 아니며 규칙을 알고 있습니다. 가능한 유일한 실수는 로컬이 아닌 PC에서 변환을하는 것입니다. 물론 웹 서버로 하여금 지역성을 인식하도록 강요하는 실수를 결코 저 지르지는 않을 것입니다. 그들은 서버 룸의 내부가 어떻게 보이는지 알 것입니다. –

답변

1

푸에르토 리코에 TimeZoneInfo과 함께 사용할 올바른 ID는 "SA Western Standard Time"입니다.

DisplayName"(UTC-04:00) Georgetown, La Paz, Manaus, San Juan"이고 일광 절약 시간을 따르지 않습니다. 놓치기 쉽지만 표시 이름의 'San Juan'은 실제로 San Juan, Puerto Rico을 참조합니다.

실제로 Windows 표준 시간대 데이터에 고유 한 표준 시간대 ID가없는 위치는 거의 없습니다. 일부는 존재하며 고정 오프셋 영역을 만들어야하는 경우도 있습니다. 예를 들어 Atikokan, Canada - 동부 표준시이지만 DST는 사용하지 않습니다.

해당 수준에 관심이있는 경우 을 사용하여 쉽게 수행 할 수있는 IANA time zones으로 전환해야합니다.

어떤 Windows 표준 시간대를 선택해야하는지 의심스러운 경우 IANA 표준 시간대를 항상 CLDR mappings과 비교할 수 있습니다. 실제로 "America/Puerto_Rico""SA Western Standard Time"의 가능한 번역 중 하나입니다.

+0

좋은 답변입니다. 감사. 분명히 무의식적 인 연구는 그들이 대서양 표준시라고 나에게 보여 줬다. 다른 사례에 대해서도 추가 참조를 주셔서 감사 드리며, 내가 만날 것이라고 확신합니다. http://www.timeanddate.com/worldclock/city.html?n=226 – danmiser

0

사실 DST가 사용되는지 여부를 나타내는 시간대로 SupportsDaylightSavingTime 속성이 있습니다. 예 :

ReadOnlyCollection<TimeZoneInfo> zones = TimeZoneInfo.GetSystemTimeZones(); 
foreach(TimeZoneInfo zone in zones) 
{ 
    if (! zone.SupportsDaylightSavingTime) 
     Console.WriteLine(zone.DisplayName); 
} 

은 DST가없는 모든 표준 시간대를 인쇄합니다.

푸에르토 리코에 자체 시간대가없는 경우 다음 최적의 옵션은 일치하는 시간대 (즉, 동일한 오프셋 및 DST없이)를 찾아 사용하는 것입니다. 해당 영역이 없으면 UTC를 사용하고 상수 오프셋을 적용하십시오.

+0

전체 표준 시간대입니다. 푸에르토 리코는 대서양 표준시 시간대에 있지만 일광 절약 시간제를 지원하지 않습니다. zone 속성을 설정할 수 있다면.SupportsDaylightSavingTime, 전체 표준 시간대보다 더 구체적인 지식으로 재정의 할 수 있습니다. 그런 다음 TimeZoneInfo.ConvertTimeFromUtc를 호출 할 수 있습니다. – danmiser

+0

@danmiser 오, 푸에르토 리코는 자신의 시간대가 있다고 생각했습니다. 그런 다음 가장 적합한 옵션은 일치하는 시간대 (즉, DST가없는 동일한 오프셋)를 찾아서 사용하는 것입니다. 해당 영역이 없으면 UTC를 사용하고 상수 오프셋을 적용하십시오. –

+0

@PetrAbdulin - 맞습니다. 내 대답을 보라. –

관련 문제