2017-03-22 31 views
3

C# 응용 프로그램에서 SetSystemTime에 대한 호출이 있습니다. 그러나 Windows 표준 시간대가 UTC에서 0이 아닌 오프셋으로 설정되어있는 경우, 때때로 제공된 시간이 UTC (즉, 현지 시간으로 변환)이고 다른 시간은 그렇지 않은 것처럼 시스템 시계를 조정하는 것처럼 보입니다 시간을 직접 date 매개 변수로 설정합니다.SetSystemTime - UTC 또는 현지 시간?

[StructLayout(LayoutKind.Sequential)] 
    internal struct SystemTime 
    { 
     public short Year; 
     public short Month; 
     public short DayOfWeek; 
     public short Day; 
     public short Hour; 
     public short Minute; 
     public short Second; 
     public short Milliseconds; 
    } 

    [DllImport("kernel32.dll", SetLastError = true)] 
    internal static extern bool SetSystemTime(ref SystemTime st); 

    public static bool AdjustSystemClock(DateTime date) 
    { 
     SystemTime systemTime = new SystemTime(); 
     systemTime.Year = (short)date.Year; 
     systemTime.Month = (short)date.Month; 
     systemTime.Day = (short)date.Day; 
     systemTime.Hour = (short)date.Hour; 
     systemTime.Minute = (short)date.Minute; 
     systemTime.Second = (short)date.Second; 
     return SetSystemTime(ref systemTime); 
    } 

의 차이는 것 같습니다 : 나는 Windows를 사용하는 시간대를 설정하면 나는 그것이 UTC 인 경우로 제공 시간을 조정 SetSystemTime() 호출 할 때, 다음, 응용 프로그램을 시작합니다.

그러나 SetDynamicTimeZoneInformation() 함수를 사용하여 시간대를 설정 한 다음 응용 프로그램을 다시 시작한 다음 SetSystemTime()을 호출하면 표준 시간대와 상관없이 내가 제공 한 시간으로 직접 시간이 설정됩니다.

이것은 예상되는 동작입니까? 시간대를 설정하는 두 가지 방법간에 일관성을 유지하려면 어떻게해야합니까?

+0

SetSystemTime()은 "내가 제공 한 시간에 직접 시간을 설정하지 않습니다." UTC 시간을 설정합니다. 아일랜드에 거주하는 경우를 제외하고는 UTC + 0 시간대에 위치합니다. 정확하게 축복이 아닙니다. 컴퓨터가 비행기 안에 있지 않으면 무작위로 SetDynamicTimeZoneInformation()을 호출하는 것이 바람직하지 않습니다. .NET 프로그램에서 시간대 변경을 인식하게하려면 다시 시작하거나 CultureInfo.ClearCachedData + TimeZoneInfo.ClearCachedData를 호출해야합니다. 이러지 마. –

+0

Windows 컴퓨터는 자동으로 시간을 동기화합니다. 내장 기능을 사용하는 것이 더 안전하지 않습니까? 동기화 빈도를 변경하거나 [설정 및 Win32tm 도구를 통해 강제로 동기화] (https://technet.microsoft.com/ko-kr/windows-server-docs/identity/ad-ds/get-started/windows) -time-service/windows-time-service-tools-and-settings) –

답변

1

나는이 문제를 발견했다고 생각한다.

Bias 속성을 설정하지 않은 경우 코드 비트를 작성한 사람이 SetDynamicTimeZoneInformation()으로 바뀌 었습니다.

따라서 설정되는 표준 시간대 정보의 UTC 오프셋은 0이므로 조정할 필요가 없습니다.

+0

시간을 직접 설정하는 대신 OS에서 자동으로 수행하도록하지 않는 이유는 무엇입니까? 도메인 컴퓨터는 도메인 컨트롤러와 자동으로 동기화됩니다. 독립 실행 형 컴퓨터 (또는 DC)는 날짜 및 시간 설정에 지정된 시간 서버와 자동으로 동기화됩니다. –

+0

@PanagiotisKanavos -이 응용 프로그램의 원래 개발자는 아니었지만 분명히 이런 식으로 작업 한 좋은 이유가있었습니다. 우선, 그것은 주요 Windows OS에 대한 사용자 액세스를 제공하지 않는 특수 장치 (Windows Embedded 7)에 있습니다. (셸 응용 프로그램은 장치를 켤 때이 응용 프로그램을로드 한 다음 응용 프로그램을 종료 할 때 장치를 끕니다.) – colmde

+0

Windows Embedded에서도 시간 동기화를 사용할 수 있습니다. 이 질문을 확인하십시오 : [일괄 또는 유사하게 Windows 임베디드 표준 설정 인터넷 시간 서버] (http://stackoverflow.com/questions/34016933/setting-internet-time-server-on-windows-embedded-standard-through- batch-or-simil). 동기화 된 클럭이 없으면 만료 된 패킷을 검사하는 SSL 또는 다른 형태의 암호화를 사용할 수 없습니다. 여기에는 도메인 운영자와의 커뮤니케이션이 포함됩니다. –