2011-01-11 2 views
4

나는이 질문을 실현 "일광 절약 변경 시계 조정"을 할 수있는 옵션에 의해 영향을받는 델파이 NOW 함수의 결과입니다. 나는 게으른 것이 아니라, 그 대답이 일반적으로 유용 할 것이라고 생각했습니다.방법은 몇 가지 테스트 코드를 작성 응답 수 있었다

내가합니다 (NOW 루틴에 의해 반환) 현지 시간으로 각인 된 레코드와 많은 양의 데이터를 생성 한 응용 프로그램을 가지고있다. DST로 변경하면 시간이 없어지고 DST를 종료하면 1 시간이 반복됩니다. 이로 인해 주문 된 레코드가 있다고 가정하는 조작에 문제가 발생합니다.

이 응용 프로그램은 UTC의 모든 날짜 시간 작업을하는 것이 변경되었습니다,하지만 난 UTC 또는 현지 시간으로 날짜 시간을 표시하는 기능이있을 것이다. 또한 현지 시간에 저장된 datetime을 처리해야하며 올바르게 시간이 UTC로 변경되었는지 확인해야합니다. DST가 실행되는 동안 datetime이 저장되었을 수 있으므로 일반적으로 DST 기간 내에 또는 임의의 임의의 날짜가 있는지 여부를 결정할 수 있어야합니다. 물론 datetime이 모호하고 일광 절약 시간이 종료되기 전 마지막 시간 또는 종료 후 첫 시간에있을 수있는 1 시간의 기간이 있습니다. 이 문제를 해결할 방법이 없습니다.

변경 사항을 코딩, 나는 지금 호출의 결과에 대해 궁금해했다. 내부적으로 GetLocalTime을 호출합니다. DST 기간 내에있을 때 GetLocalTime (및 NOW)은 무엇을 반환하지만 "일광 절약 시간제 변경을위한 시계 조정"옵션이 해제되어 있습니까?

어떻게에 관계없이 꺼져 있거나 켜져있는 "일광 절약 변경 시계를 조정"여부 (적용되는 DST 바이어스로)는 DST 기간 내에서 현재 날짜를 반환하는 루틴을 작성하려면 어떻게해야합니까?

+3

http://blogs.msdn.com/b/oldnewthing/archive/2003 : 이전 XP에 비해 아무것도 실행되도록 응용 프로그램을 원하는 경우, '지연'기능의 속성 (KERNEL32에서)이로드 /10/24/55413.aspx –

+0

여기에 좋은 의견이 있습니다. 감사합니다 Andreas. – rossmcm

+0

또한 여기에 좋은 의견이 있습니다. http://www.koders.com/delphi/fidA2B617851F002361ABF0188FB1816D260AFCC8A8.aspx?s=delphi – rossmcm

답변

4

나는 쉽게 문제를 해결할 수 있다고 생각하지 않습니다.
너무 많은 변수가 있습니다

  • 저장된 타임 스탬프
  • 시간대
  • 끊임없이 변화하는 시간대이 시간대 규칙은 모든 장비에 대한 정확한 것을
  • 확인 규칙에 당신은 당신은 사용합니다 (즉, 모든 사람들이 항상 패치를 적용했습니다).
  • 시계의 부정확도

시간대 규칙에 도움이되는 Delphi TZDB project이 있습니다.

  • 해당 지역의 형식
  • 현재 시간대
  • UTC의 타임 스탬프의 타임 스탬프 :

    나는 위의 모든 변수에 의존하지만, 세 개의 필드를 저장하지 훨씬 더 실용적이라고 생각 형식

세 번째 필드와 첫 번째 두 필드에서 정렬을 수행합니다.

--jeroen

+0

+1이 전체 영역은 매우 까다 롭습니다. 나는 실용적인 해결책 –

2

사용 TzSpecificLocalTimeToSystemTime (및 명백한 역). 이를 통해 현지 날짜/시간에 적용되는 일광 절약 시간 설정에 따라 UTC와 현지 날짜/시간을 변환 할 수 있습니다.

function TzSpecificLocalTimeToSystemTime(lpTimeZoneInformation: PTimeZoneInformation; 
    var lpLocalTime, lpUniversalTime: TSystemTime): BOOL; stdcall; 

function TzSpecificLocalTimeToSystemTime; external kernel32 name 'TzSpecificLocalTimeToSystemTime' delayed; 
+0

+1을 좋아하지만,이 함수는 매번 날짜가 정해진 시간에 윈도우가 업데이트되지 않으면 잘못된 결과를 반환합니다. –

+0

더 자세히 설명 할 수 있습니까? TZ 정의 변경 사항을 잡기 위해 정기적 인 'Windows Update'검사를 수행 하시겠습니까? 아니면 그렇지 않다면, 무엇에? – frogb

관련 문제