답변:
일부 장기 암호화 인증서에서 2038 년이 지난 날짜를 처리해야하는 임베디드 Linux 시스템에서이 문제가 발생 했으므로이 가능성은 응용 프로그램 도메인에 따라 다릅니다.
대부분의 시스템은 2038 년 이전에 잘 준비되어 있어야하지만, 오늘 날짜를 미래까지 계산할 경우 문제가있을 수 있습니다.
mktime
전화가 자동으로 실패했습니다.
영향을받는 코드가 일반적으로 하위 수준 (CTIME)이므로 시간이 저 장된 장소를 파악하기가 더 어렵 기 때문에 이것이 1999/2000 년의 Y2K 문제보다 훨씬 더 심각한 문제라고 생각합니다.
문제를 더 복잡하게하기 위해 Y2K가 축축한 스 퀴브 인 것으로 인식되어 이벤트 시작시 문제에주의를 기울이기가 더 어려워집니다.
문화적 참조 :
Cory Doctorow는 오픈 라이센스 하에서 단편 스토리 커미셔닝 / 출판을위한 새로운 모델을 시도하고 있었고, 나는 그 중 하나를 2038 테마로 제안했습니다 .
64 비트 OS는 궁극적으로 2037 문제와 관련이 없습니다. (CTIME은 2038보다 2037에 더 가깝습니다).
문제는 OS의 비트 심도가 아니라 OS가 시간을 어떻게 저장 하는가입니다. 또는 데이터베이스 열이 시간을 저장하도록 어떻게 선택합니까? 또는이 디렉토리 서비스 시간 구문 속성이 백엔드에 시간을 어떻게 저장합니까?
이것은 32 비트 시간 카운터를 사용하는 것이 매우 고유하고 일반적이기 때문에 사람들이 생각하는 것보다 훨씬 더 큰 문제입니다.
시간을 저장하는 각 인스턴스를 다시 방문하고 모든 API를 업데이트하고이를 사용하는 모든 도구도 업데이트해야합니다.
작성된 원시 데이터 대신 사람이 읽을 수있는 시간 형식을 통해 시간을 설정할 수있는 추상화 계층이 더 쉬워 지지만 단 한 가지 경우입니다.
나는 이것이 대부분의 사람들이 생각하는 것보다 훨씬 더 큰 거래가 될 것이라고 생각합니다.
time_t
. 연도, 월, 일을 하나의 16 비트 값으로 필드로 저장합니다. 하루는 5 비트, 월은 4, 연도는 7입니다. 2107은 1980 (FAT 토지에서 0 년) + 2 ^ 7-1입니다. 더 재미있게, FAT는 다른 16 비트 값으로 시간을 같은 방식으로 저장하지만 수학을 수행하면이 방법으로 시간을 저장하기 위해 17 비트가 필요하다는 것을 알 수 있습니다. FAT는 몇 초 동안 1 비트의 해상도를 떨어 뜨려이 문제를 해결합니다. FAT는 2 초 미만의 변화를 구별 할 수 없습니다. 아, 마이크로 소프트, 당신의 불필요한 비 호환성없이이 얼마나 지루한 세상일까요!
이것은 내 의견이지만이 문제는 32 비트 카운터 문제로 인한 것입니다. 오늘날 대부분의 OS는 64 비트 (최소 64 비트 컴퓨터에서)의 시간을 처리하도록 업데이트되므로 모든 OS 및 소프트웨어가 오래 준비 될 것이라고 생각합니다 2038 년 이전에 2020이라고 가정하겠습니다. 따라서 2038 년에 2020 년까지 소프트웨어를 계속 실행하는 경우에만 문제가있을 수 있습니다
. 거의 모든 경우에 문제가되지 않을 것입니다. 나는 희망.
소프트웨어 및 하드웨어 공급 업체가 제품을 "Y2K 호환"으로 인증해야하는 최초의 Y2K 블리츠 기간 동안 (PC 연결의 네트워크 케이블은 Y2K 호환 인증됨을 기억합니다) 많은 회사가 모든 것에 대한 자세한 감사를 수행했습니다 앞으로 시계를 설정하고 테스트하여
당시 테스트 비용이 너무 높았 기 때문에 1/1/99 (일부 개발자는 99를 센티널로 사용했을 수 있음), 12/31/99, 1 / 1 /과 같은 여러 날짜로 거의 항상 테스트했습니다. 00, 2000 년의 도약, 1/19/38 등. 지루한 목록 은 여기 를 참조 하십시오 .
따라서 1999 년에 있었던 중요한 소프트웨어에는 아마도 2038 개의 버그가 없지만 그 이후로 무지한 프로그래머가 작성한 새로운 소프트웨어가있을 것이라고 생각합니다. 전체 Y2K debacle 프로그래머가 일반적으로 날짜 인코딩 문제에 대해 훨씬 더 많이 알게 된 이후 Y2K만큼 큰 영향을 미치지는 않을 것입니다.
그때까지 계속 실행되는 32 비트 시스템은 문제가됩니다.
#include <time.h>
#include <stdio.h>
int main() {
time_t t = (time_t)(1L << (sizeof(time_t)*8 - 9));
printf("%d\n", sizeof(time_t));
}
9 대신 1이어야하지만 ctime은 더 큰 날짜를 처리하지 않습니다.
8 - Sun Jun 13 07:26:08 1141709097
내 시스템 (물론 64 비트) 시간은 백만 년 이상 지속될 수 있습니다. 해결책은 시스템을 64 비트로 업데이트하는 것입니다.
문제는 프로그램이 처리하지 못할 수 있다는 것입니다. 특히 오래되고, 재산이며 유지되지 않는 것. 개발자는 다음 사실에 익숙합니다.
int
는 32 비트입니다 (실제로 32 비트라고 가정하기 때문에 64 비트 시스템에서 32 비트로 유지됨)time_t
:)은 안전하게 캐스팅 할 수 있습니다.int
인기있는 FLOSS 소프트웨어에서 두 가지 모두 '많은 눈'검토를 거치지 않을 것입니다. 덜 인기 있고 재산이 많으면 저자에 따라 크게 달라집니다.
나는 무료 * nix 세계에서 2038은 '비정상적인'것으로 생각하지만 "소유권"플랫폼 (즉, 많은 수의 소프트웨어 소프트웨어가있는 플랫폼)에서 문제를 기대합니다. 특히 일부 crutial 부분이 유지되지 않을 경우.
time_t
32 비트 OS에서 (또는 동등한) 32 비트가 발생하는 반면 time_t
64 비트 OS에서 (또는 동등한) 64 비트가 발생합니다. 나는 특정 단순화로도 충분히 명확하다고 생각했습니다.
Y2K 문제는 4 개가 아닌 연도를 나타내는 2 개의 헌장이었습니다.
많은 시스템은 '00'만 저장했기 때문에 2000과 1900을 구분할 방법이 없었습니다.
거의 모든 시스템은 이제 연도를 저장하기 위해 4 개의 문자를 사용하거나 일종의 라이브러리를 사용합니다.
따라서 10000 년 (Y10K)에 대해 모두 걱정해야합니다. OS 및 라이브러리 작성자를 제외하고 ...