문제

그만큼 FILETIME 구조 Microsoft 문서에 따르면 1601년 1월 1일(아마도 그날의 시작일)부터 계산됩니다. 하지만 윤초도 포함됩니까?

도움이 되었습니까?

해결책

질문은 그렇지 않아야합니다 FILETIME 도약 초를 포함합니다.

그것은해야한다:

해석하는 사람들, 기능 및 도서관을하십시오. FILETIME (즉 FileTimeToSystemTime) 기간을 계산할 때 도약 초를 포함합니까?

간단한 대답은입니다 "아니요". FileTimeToSystemTime 몇 초 반량 0..59.


더 간단한 대답은 다음과 같습니다. "물론, 어떻게 할 수 있었습니까?".

내 Windows 2000 머신은 출시 된 이후 10 년 동안 2 초가 더 추가되었다는 것을 알지 못합니다. 그것이 해석하는 모든 해석 FILETIME 잘못되었습니다.


마지막으로, 논리에 의존하기보다는 직접 실험적 관찰로 포스터 질문에 대한 답을 결정할 수 있습니다.

var
    systemTime: TSystemTime;
    fileTime: TFileTime;
begin
    //Construct a system-time for the 12/31/2008 11:59:59 pm
    ZeroMemory(@systemTime, SizeOf(systemTime));
    systemtime.wYear := 2008;
    systemTime.wMonth := 12;
    systemTime.wDay := 31;
    systemTime.wHour := 23;
    systemtime.wMinute := 59;
    systemtime.wSecond := 59;

    //Convert it to a file time
    SystemTimeToFileTime(systemTime, {var}fileTime);

    //There was a leap second 12/31/2008 11:59:60 pm
    //Add one second to our filetime to reach the leap second
    filetime.dwLowDateTime := fileTime.dwLowDateTime+10000000; //10,000,000 * 100ns = 1s

    //Convert the filetime, sitting on a leap second, to a displayable system time
    FileTimeToSystemTime(fileTime, {var}systemTime);

    //And now print the system time
    ShowMessage(DateTimeToStr(SystemTimeToDateTime(systemTime)));

1 초 더 추가

12/31/2008 11:59:59pm

주어진

1/1/2009 12:00:00am

보다는

1/1/2009 11:59:60pm

Qed

오리지널 포스터는 그것을 좋아하지 않을 수도 있지만, 하나님은 의도적으로 그것을 조작하여 1 년이 하루 종일 균등하게 나눌 수 없도록했습니다. 그는 프로그래머를 망치기 위해 그렇게했습니다.

다른 팁

여기특정 날짜가 선택된 이유에 대한 더 많은 정보입니다.

Filetime 구조는 1601 년 1 월 1 일 이후 100 나노초 간격의 형태로 시간을 기록합니다. 왜 그 날짜가 선택 되었습니까?

Gregorian 캘린더는 400 년 주기로 작동하며 1601은 Windows NT가 설계 될 때 활성화 된주기의 첫해입니다. 다시 말해, 수학을 멋지게 만들기 위해 선택되었습니다.

나는 실제로 Dave Cutler의 이메일을 확인합니다.

먼저 결정하지 않고이 질문에 대한 단일 답변은 없을 수 있습니다. Windows Filetime은 실제로 무엇을 계산합니까? Microsoft Docs는 1601 UTC 이후 100 나노초 간격을 계산한다고 말하지만 이것은 문제가됩니다.

1960 년 이전에 국제적으로 조정 된 시간의 형태는 존재하지 않았다. UTC 자체는 1964 년 이전에 어떤 문헌에서도 발생하지 않는다. 공식 명칭으로서 UTC라는 이름은 1970 년까지 존재하지 않았다. 그러나 더 나빠진다. 로얄 그리니치 천문대는 1676 년까지 설립되지 않았으므로 GMT가 명확한 의미가 없기 때문에 필레 타임을 해석하려고 시도해도 정확한 탈출을 가진 진자 시계가 1 초의 정확도를주기 시작했습니다.

FileTime이 평균 태양 초로 해석되면 1601 이후의 도약 수는 0이므로 UT는 도약 초가 없습니다. 원자력 운동량이있는 것처럼 필더 타임이 해석되면 1601 년 이후 도약 초의 수는 약 -60입니다 (음의 60 도약).

그것은 고대의 역사입니다. 원자력 운동가 이후의 시대는 어떻습니까? 국가 정부가 평균 태양 초와 SI 초를 구별하지 않았기 때문에 더 나은 것은 아닙니다. 10 년 동안 ITU-R은 도약을 포기하는 것에 대해 논의 해 왔지만 국제적 합의를 달성하지 못했습니다. 그 이유 중 일부는이 페이지의 JavaScript (고대 역사의 음모는 해당 페이지의 델타 -T 링크를 참조하십시오). 국가 정부는 명확한 구별을하지 않았기 때문에 1972 년 이후 몇 초를 정의하려는 시도는 일부 관할권의 법률에 따라 무효화 될 위험이 있습니다. ITU-R의 대표는 POSIX위원회의 사람들과 마찬가지로 이러한 복잡성을 알고 있습니다. 외교 문제가 해결 될 때까지, 국가 정부와 국제 표준이 평균 태양과 SI 초 사이를 명확하게 구별하고 선택할 때까지 컴퓨터 표준이 따라갈 수있는 희망은 거의 없습니다.

도약 초는 IERS에 의해 예측할 수 없을 정도로 추가됩니다. UTC와 도약 초가 정의 된 1972 년 이후 23 초가 추가되었습니다. Wikipedia는 "지구의 회전률은 장기적으로 예측할 수 없기 때문에 6 개월 이상 전에 그들에 대한 필요성을 예측할 수 없다"고 말했다.

도약 초가 삽입되었을 때의 역사를 유지하고 OS를 계속 업데이트하여 삽입되었을 때의 참조를 유지하고 차이가 너무 작기 때문에 일반적인 목적 OS가 기대하지 않는 것이 공정합니다. 도약 초를 보상하십시오.

또한 UTC와 비교하여 PC의 단순한 전자 클럭의 일반 클록 드리프트는 도약 초에 필요한 보상보다 훨씬 큽니다. 도약 초를 보상하기 위해 정밀도가 필요하다면 매우 비밀스러운 PC 시계를 사용해서는 안됩니다.

이 질문에 대한 대답은 이전에는 '아니오'였지만 다음과 같이 변경되었습니다. 응, 좀, 가끔...

Windows 네트워킹 팀 블로그 기사:

Server 2019부터 Windows 10(2018년 10월) 업데이트 시간 API는 이제 FILETIME을 SystemTime으로 변환할 때 운영 체제가 인식하는 모든 윤초를 고려합니다.

이 기능이 추가된 이후 윤초가 발생하지 않았으므로 운영 체제는 여전히 윤초를 인식하지 못합니다.그러나 다음 공식 윤초가 세상에 나오면 이 새로운 기능이 활성화된 Windows 컴퓨터는 이를 추적하므로 FILETIME 값은 해석될 때 컴퓨터의 윤초 수에 따라 오프셋됩니다.

블로그 게시물에서는 다음을 설명합니다.

FILETIME은 변경되지 않습니다.이는 에포크 시작 이후 여전히 100ns 간격의 수를 나타냅니다.변경된 것은 SYSTEMTIME으로 변환된 후 다시 변환될 때 해당 숫자의 해석입니다.영향을 받는 API 목록은 다음과 같습니다.

  • GetSystemTime
  • 로컬 시간 가져오기
  • FileTimeToSystemTime
  • FileTimeToLocalTime
  • SystemTimeToFileTime
  • 시스템 시간 설정
  • 로컬시간 설정

이 릴리스 이전에는 SYSTEMTIME의 wSecond에 대해 0에서 59 사이의 유효한 값이 있었습니다.SYSTEMTIME은 이제 연도, 월, 일이 윤초가 유효한 날짜를 나타내는 경우 값 60을 허용하도록 업데이트되었습니다.

...

SYSTEMTIME 구조에서 60초를 받으려면 프로세스가 명시적으로 옵트인해야 합니다.

선택은 다음 방법에 나열된 기능 내 동작에 적용됩니다. FILETIME 에 매핑됩니다 SYSTEMTIME.귀하의 선택 여부에 관계없이 운영 체제는 여전히 상쇄됩니다. FILETIME 인식되는 윤초에 따른 값입니다.

호환성과 관련하여 기사에서는 다음과 같이 설명합니다.

타사 프레임워크를 사용하는 애플리케이션은 Windows에서의 프레임워크 구현이 올바른 API를 호출하여 정확한 시간을 계산하는지 확인해야 합니다. 그렇지 않으면 애플리케이션에 잘못된 시간이 보고됩니다.

또한 다음 링크를 제공합니다. 이전 게시물 다음과 같이 전체 기능을 비활성화하는 방법을 설명합니다.

...다음 레지스트리 키를 추가하면 이전 운영 체제 동작으로 되돌리고 전반적으로 윤초를 비활성화할 수 있습니다.

  • HKLM:\SYSTEM\CurrentControlSet\Control\LeapSecondInformation
  • 유형:"REG_DWORD"
  • 이름:활성화됨
  • 값: 0 시스템 전체 설정을 비활성화합니다.
  • 값: 1 시스템 전체 설정을 활성화합니다.

그런 다음 시스템을 다시 시작하십시오.

매우 조잡한 요약 :

utc = (원자 시간) + (도약 초) ~~ (평균 태양 시간)

MS 문서는 구체적으로 "UTC"라고 말하며 도약 초를 포함해야합니다. 항상 MS와 마찬가지로 마일리지는 다를 수 있습니다.

이것에 따르면 논평 Windows는 완전히 도약을 알지 못합니다. 오늘 1:39:45를 나타내는 파일 타임에 24 * 60 * 60 초를 추가하면 내일 1:39:45를 나타내는 파일 타임이 무엇이든 상관없이 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top