윈도우와 유닉스는 시간단위가 달라서 서로 호환이 안됩니다.
윈도우 시간은 64비트 정수에 1601년 1월 1일 부터 100나노 초 단위로 1씩 증가하고, 유닉스 시간은 32비트 정수에 1970년 1월 1일부터 1초 단위로 1씩 증가합니다.
특히나 윈도우에서 사용되는 C 표준함수(C Run-Time Library)들은 유닉스와 같이 1970년 1월 1일을 기준으로 날짜를 처리합니다.
그래서 윈도우 API와 C 표준함수를 섞어서 프로그램을 만들었을 경우 시간 단위가 맞지 않게 됩니다. 윈도우 API만 사용하거나 C 표준함수만 사용하여 프로그램을 만드는 것이 좋겠지만 섞어서 쓰게되는 경우가 있을 수 있습니다. 예를 들면 유닉스(리눅스)의 프로그램을 윈도우에 포팅한다거나 그 반대의 경우입니다. 이럴 때 두 시간 단위를 어떻게 변환하는지 설명하겠습니다.
윈도우 시간에서 유닉스 시간으로 변환
윈도우 시간은 1601년 부터 시작했고 유닉스 시간은 1970년 부터 시작했기 때문에 먼저 시작한 윈도우 시간이 훨씬 숫자가 큽니다. 윈도우 시간 단위(100나노 초)를 유닉스 시간 단위(1초)로 변환 한 뒤, 1601에서 1970년의 차이인 369년을 빼주면 됩니다.
유닉스 시간에서 윈도우 시간으로 변환
위와 반대로 유닉스 시간이 나중에 시작 했기 때문에 윈도우 시간보다 숫자가 작습니다. 유닉스 시간 단위(1초)에서 윈도우 시간 단위(100나노 초)로 변환한 뒤 1601년과 1970년의 차이인 369년을 더해주면 됩니다.
그럼 이제 실제로 계산을 해보겠습니다.
윈도우 -> 유닉스
윈도우 시간 / 10000000을 하면 유닉스 시간 단위인 1초 단위가 됩니다. 1초는 1000000000나노 초이기 때문에 윈도우에서는 1초가 10000000입니다. (100나노초가 최소 단위이므로)
여기에 369년을 뺍니다. 369년 x 365일 = 134685일이고 여기에 89일을 뺀 134774일을 빼야 합니다. 왜 89일이냐하면 1601년과 1970년 사이에 윤년이 계산상으로는 92개지만, 한 세기가 시작하는 해는 윤년이 아닙니다. 즉 1700, 1800, 1900년은 윤년이 아니므로 이 3개를 제외하면 실제 윤년은 89개가 됩니다. (윤년은 하루가 더 길기 때문에 때문에 89일이 됩니다.)
(참고로 한 세기가 시작하는 해라고 하더라도 400으로 나누어 떨어지는 해는 윤년이 아닙니다. 즉 1600년, 2000년은 윤년이 아닙니다.)
134774일을 초로 바꾸면 134774일 x 24시간 x 60분 x 60초 = 11644473600초가 되고 유닉스 시간단위로 변환한 값에 11644473600초를 빼면 됩니다.
유닉스 -> 윈도우
유닉스 시간에 11644473600초를 먼저 더한 값을 윈도우 시간 단위로 변환합니다. 유닉스 시간 * 10000000을 하면 100나노 초 단위인 윈도우 시간이 됩니다. (윈도우 시간으로 먼저 변환한 뒤 100나노초 단위인 116444736000000000을 더해줘도 됩니다.) 물론 변수는 64비트 정수형을 사용해야 하겠죠.
간단하게 하면 정리를 하면
윈도우 -> 유닉스 : 윈도우 / 10000000 - 11644473600
유닉스 -> 윈도우 : (유닉스 + 11644473600) * 10000000 혹은 유닉스 * 10000000 + 116444736000000000

'시간 단위'에 해당되는 글 2건
- 2007/04/14 윈도우 시간과 유닉스 시간의 상호 변환
- 2007/03/24 윈도우에서는 1초를 이렇게 표현한다
윈도우에서 1초를 어떻게 표현하는지 설명해 보겠습니다.
먼저 시간의 단위부터 알아야 하겠죠? 다들 잘 아시겠지만 시간 단위에 대해 애매한 분들을 위해 단위 부터 먼저 설명하겠습니다.
- 밀리 초(millisecond) : 천 분의 1초입니다. 10^-3, 1/1000
- 마이크로 초(microsecond) : 백만 분의 1초입니다. 10^-6, 1/1000000
- 나노 초(nanosecond): 십억 분의 1초입니다. 10^-9, 1/1000000000
나노 초 이하의 단위는 잘 쓰이지 않기 때문에 생략했습니다.
그러면 윈도우에서는 시간을 64비트 크기의 변수에 저장하며 최소 단위는 100 나노 초입니다. 즉 1씩 증가하면 100나노 초씩 증가하는 것이죠.
그래서 1초를 표현해보면 아래와 같습니다.
0000 0000 0000 1000 0000 (1초, 10 진수 만 단위)
1초가 되려면 10억 나노 초가 되야 하는데 천만을 쓴 것은 최소 단위가 100 나노 초이기 때문에 100을 나누어 주어서 입니다.
이것을 16진수로 표현하면 0x00000000 00989680이 됩니다. 이건 절대시간이므로 1601년 1월 1일 00시 00분 1초가 됩니다.
상대 시간은 음수로 표현하는데, 0x00000000 00989680을 음수로 바꾸어 보겠습니다. 일단 2진수로 바꾸면
00000000000000000000000000000000 00000000100110001001011010000000
0x00000000 00989680
11111111111111111111111111111111 11111111011001110110100101111111
1의 보수 (비트 반전)
11111111111111111111111111111111 11111111011001110110100110000000
2의 보수 (+1)
0x00000000 00989680
11111111111111111111111111111111 11111111011001110110100101111111
1의 보수 (비트 반전)
11111111111111111111111111111111 11111111011001110110100110000000
2의 보수 (+1)
이렇게 하여 최종 값인 1111111111111111111111111111111111111111011001110110100110000000이 나왔습니다. 맨 앞에 비트가 1이므로 음수입니다.
그래서 상대시간 1초는 0xFFFFFFFF FF676980로 표현할 수 있습니다.

댓글을 달아 주세요