2038년 문제에 대해서 알고 있나요?

개발하다가 MySQL DB에 DATETIME 날짜형식을 저장하는 이야기 하다가, UTC 이야기 하다가. UTC의 2038년 문제가 발생 할 수 있다고 지금이 2020년이니까 18년이면 금방 다가올것이다. 뭐 이런이야기를 하다가, 대충 들어서 알고 있는데, 왜 발생하는지 명확하게 몰라서 Wiki좀 찾아봤습니다.

UTC시간이란?

UTC(Coordinated Universal Time) 협정 세계시로 1972년(1970년? ) 1월 1일부터 시행된 국제적인 표준 시간을 말합니다. 그리니치 표준시(GMT)를 대체하여 사용하기 시작한 표준시 입니다.

참고로, 예전에 유럽여행 갔을때 방문했던 영국 그리니치 천문대가, 그리니치 표준시(GMT)를 나타내는 기준이 됩니다.

대한민국 시간대는

대한민국 시간대는 KST(Korea Standard Time) 으로 UTC+9 에 속합니다.

유닉스 시간(Unix Time)은 시각을 나타내는 방식입니다. 흔히, POSIX 시간, Epoch 시간 (이건 자바에서 많이 들어봤던 거죠? )이라고 부르기도 합니다. 문제는 1970년 1월1일 00:00:00 협정세계시(UTC)부터 경과시간을 초로 환산하여 정수로 나타낸 것입니다.

여기서 중요한건, 정수로 나타냈다!

그렇기 때문에 32비트로 표현된 유닉스 시간은 20170년 1월 1일 00:00(UTC)에서 2,147,483,647 (231 - 1) 지난 후인 2038년 1월 19일 03:14:08 UTC 에 문제가 발생하게 됩니다. 그렇기 때문에 유닉스 계열의 운영체제나 여러 다른 운영체제에서 문제가 발생할 수 있습니다.

32비트? 64비트 ?

전산학을 배우지 않은 저한테 비트는 쉽지 않은 이야기 입니다.

스크린샷 2020-12-14 오후 9 53 30

출처: https://m.blog.naver.com/PostView.nhn?blogId=ezpbill&logNo=221023784363&proxyReferer=https:%2F%2Fwww.google.com%2F

bit는 0과 1로 표현하는 단위이고, bit가 크면 클수록 한번에 처리할 수 있는 양이 많아 집니다. 32bit로 처리할 수 있는 경우의 수를 계산해 보면 2 x 2 x …. x 2 (각각 1bit마다 0또는 1 의 경우가 들어갈 수 있기 때문에 두가지 경우이고, 각 비트자리 마다 경우의 수를 계산해 보면 곱으로 이루어지니까 )

  • 32비트: 2^32승 - 4,294,964,296 비트
  • 64비트: 2^64승 - 18,446,744,073,709,551,616 비트

32비트에 저장할수 있는 정수 범위

32비트에 저장할 수 있는 정수 값의 범위는 0부터 4,294,967,295, 또는 −2,147,483,648부터 2,147,483,647까지이다. 그래서 유닉스 시간에 32비트 정수형을 쓴느 모든 컴퓨터의 시계가 UTC 0 기준으로 2038년 1월 19일 3시 14분 07초 가 지나는 순간 사인 비트 가 1로 바뀌면서 음수가 되어 1901년 12월 13일 20시 45분 52초나 자동으로 오류를 감지하고 초깃값인 0, 즉 1970년 1월 1일 0시 정각으로 돌아가게 되는 버그를 칭한다.

참고

2038년 문제에 대해서 알고 있나요?

https://umanking.github.io/2020/12/14/2038year-problem/

Author

umanking

Posted on

2020-12-14

Updated on

2020-12-21

Licensed under

댓글