본문 바로가기

프로그래밍

FILETIME

윈도우가 지원하는 시간포맷중 하나.

1000만분의 1초단위(100나노초)로 표현되며 1601년 1월 1일 을 기준으로 경과한 시간이다.

1초 = 1,000밀리초 = 1,000,000 마이크로초 = 100 나노초(1/10,000,000 초)

typedef struct _FILETIME {
  DWORD dwLowDateTime;
  DWORD dwHighDateTime;
} FILETIME, *PFILETIME;

상,하위 32비트 값으로 구성되어있다.(64비트의 정수가 없던시절;;)

FILETIME 구조체로 현제 시간을 가져오는 함수. 이 함수는 UTC(GMT) 시간을 가져온다.

void WINAPI GetSystemTimeAsFileTime(
  _Out_  LPFILETIME lpSystemTimeAsFileTime
);

그런데 time_t 나 timeval 같은 유닉스 시간은 1970년 1월 1일을 기준으로 하고있어 시간 호환이 안된다.

1970년 1월 1일 기준의 유닉스시간 microseconds 로 변환하는 코드.를 작성

u_int64 filetime_to_microseconds(const FILETIME& ft)
{
	// FILETIME 은 1601-Jan-01 기준으로 10,000,000 분의 1초(100 나노초) 로 기록됨
	union
	{
		FILETIME asFileTime ;
		u_int64 asInt64 ;
	} myFileTime;

	myFileTime.asFileTime = ft;
	myFileTime.asInt64 -= 116444736000000000ULL; // 1970-Jan-01 기준 으로 변환
	return (myFileTime.asInt64 / 10); // microseconds 로 변환
}

'프로그래밍' 카테고리의 다른 글

Boost::asio – Overview – Rationale  (0) 2013.05.24
Herb Sutter: (Not Your Father’s) C++  (0) 2013.05.23
TCP 상태 변화 (TCP States)  (0) 2013.04.01
gtest 사용하기  (0) 2012.12.06
FormatMessage (Win32)  (0) 2012.12.05