2009-06-08 3 views
2

대부분의 언어에는 날짜 기능을 가지고 있습니다. 날짜 기능을 사용하면 날짜 정보를 얻기 위해 프로그래밍 할 필요가 없습니다. 이 일이 일어나기 위해 무대 뒤에서 어떻게되는지 궁금합니다.컴퓨터가 어떻게 날짜 정보를 파악합니까?

+0

여기에 어떤 퍼즐을 더 구체적으로 지정할 수 있습니까? – Joey

+2

많이 ... 직접 쓰지 마세요 : P – workmad3

답변

8

모든 컴퓨터에는 날짜와 시간을 추적하는 시스템 시계가 있습니다. 최하위 레벨에서 거기에서 검색 한 날짜 및 시간 정보. 그 위에 운영 체제에서 시간대 정보 등을 추가하면 Date 객체 나 비슷한 것을 얻을 수 있습니다.

언어/환경에 따라 날짜 개체는 날짜 계산을 직접 수행하거나이를 달성하기 위해 다른 기능을 사용해야합니다. 그것들은 윤년이 올바르게 처리되고 잘못된 날짜가 생성되지 않도록합니다.

하지만 질문이 잘못되었습니다.

3

날짜 및 시간 정보는 일반적으로 운영 체제에서 제공되므로 시스템 호출입니다. 운영 체제는 컴퓨터 메인 보드에 장착 된 실시간 시계를 다루며 소형 배터리 (수년간 지속)를 통해 작동합니다.

5

일반적으로 컴퓨터는 과거의 특정 시간 및 날짜 이후로 경과 한 시간 단위의 수를 저장합니다. 유닉스 시스템에서, 예를 들어, 이것은 유닉스 에포크 (1970 년 1 월 1 일 자정) 이후의 초 수 일 수있다. Windows의 경우 1601-01-0 (감사 Johannes Rössel) 이후 100ns 간격입니다. 또는 컴퓨터의 전원이 켜진 후 몇 초 만에 간단해질 수 있습니다.

그래서 시간/날짜 이후에 사라진 단위 수에서 운영 체제는 경과 한 년, 월, 일 등의 수를 계산할 수 있습니다. 물론 윤년과 윤초와 같은 모든 종류의 재미있는 것들이 고려되어야합니다.

NTP (Network Time Protocol)과 같은 시스템을 사용하면 네트워크를 통해 NTP 서버를 통해 컴퓨터의 내부 카운트를 원자 시계와 동기화 할 수 있습니다. 이를 위해 NTP는 왕복 시간을 고려하여 NTP 서버에 대한 링크의 종류를 학습합니다.

+2

모든 날짜/시간 시스템이 신기원은 아닙니다. 그리고 모든 에포크 기반의 것들은 둘째가 아닙니다. 예를 들어 Windows는 1601-01-01부터 100ns 간격을 사용합니다. – Joey

+0

@Johannes Cool stuff, 나는 Windows가 Unix와 다른 시대를 보냈다는 것을 깨닫지 못했다. 나는 그들이 둘 다 1970 년을 기반으로한다고 생각했다. – RichardOD

+0

Richard : Windows NT는 개념 상으로는 400 년 윤년주기의 시작을 골랐다. 1601 년에 시작되었습니다. 또한 처음부터 64 비트 값을 사용했기 때문에 1 세기 전까지만 시간 범위에 대해 걱정할 필요가 없었습니다. 여전히 Windows는 다른 시간 형식으로 흩어져 있습니다. 그 중 하나는 SYSTEMTIME (여러 필드가있는 간단한 구조체)이고 다른 하나는 사람이 읽을 수있는 문자열입니다 (지금은 이름을 모르겠습니다). – Joey

1

컴퓨터에는 시스템 시계가 있으며 BIOS에는 해당 OS에서 업데이트 할 수있는 타이머 기능이 있습니다. 언어는 거기에서 정보를 가져오고 일부는 그것을 업데이트 할 수 있습니다.

3

음 ... 대부분의 컴퓨터에는 인간의 눈금 (시간, 분)으로 시간을 계산하는 "real-time clock"이 있습니다. 일반적으로 마더 보드에는 작은 배터리가있어 시간을 기억하거나 컴퓨터 나머지 부분의 전원이 꺼지더라도 계속 계산하십시오.

오늘날 많은 컴퓨터는 network time protocol과 같은 서비스를 사용하여 주기적으로 고정밀 시계를 쿼리하여 현재 시간을 설정합니다. 이 방법으로 배터리가 제거되었거나 실패하더라도 컴퓨터는 여전히 그 시간과 날짜를 알 수 있으며 업데이트 할 수 있습니다 (실시간 칩의 시간 관리 오류를 수정하기 위해). 해당 정보 필요한만큼 자주.

1

에서이 책을 구입하십시오. 그들은 날짜 라이브러리가 두포에서 어떻게 작동하는지에 대해 당신을 기입 할 것입니다.

1

날짜/시간은 특정 날짜 이후로 시간의 관점에서 저장되는 경우가 많습니다. 예를 들어, 0001 년 1 월 1 일 이후의 진드기 (100 나노초 간격)입니다. 또한 UTC를 기준으로 usueally 저장됩니다. OS, 데이터베이스, 프레임 워크, 응용 프로그램 등의 기본 메소드는이를보다 유용한 표현으로 변환 할 수 있습니다.시스템은 날짜, 일, 월, 년 등의 구성 요소를 데이터 구조의 일부로 저장하지만 Y2K 혼란에 대한 교훈을 얻은 것은 아마도 이것이 최선의 방법이 아니라는 것입니다.

3

실시간 시계 이외에도 날짜 계산은 대부분 소프트웨어 라이브러리 기능입니다.

날짜가 다소 불규칙하므로 장면 뒤에서 근사치, 수정 및 찾아보기 테이블이 혼합되어 사용됩니다.

날짜의 표현도 다양 할 수 있지만 보통 (임의의) 시작 날짜가 사용됩니다. 천문학 자들도 사용하는 일반적인 시스템은 Julian day numbers입니다 (Julian calendar과 혼동하지 마십시오). 날짜는 초 단위로 저장하거나 시작 후 일 단위로 저장할 수 있습니다 (일반적으로 후자는 부동 소수점입니다). 여기에 some more algorithms입니다.

+0

The Julian 달력이 항상 윤년을 올바르게 지키는 것은 아닙니다. 현대 시스템은 줄리안과 거의 같은 그레고리오 력을 사용하지만 윤년이 맞습니다. –

+0

현대 시스템뿐만 아니라 몇 세기 전에 율리우스 력이 교체되었습니다. 연결된 페이지에 모두 있습니다. –

2

놀랍게도 복잡한 코드의 예상치 못한 양 등 예컨대

날짜 파싱, 계산, 생성에 필요한, 자바, 날짜는 특히 통상적으로 계산 변형은 Date, Calendar 통해 등에 저장되고 , Gregorian Calendar implementation of Calendar. (download the SDK/JDK 일 수 있으며 출처를 직접 확인하십시오.)

간략히 말하자면, 제가 소스를 빨리 읽은 것입니다 : 날짜 처리는 사소한 것이므로 스스로 시도하고 싶은 것이 아닙니다. 가능하다면 좋은 도서관을 찾으십시오. 그렇지 않으면 거의 확실하게 reinventing the square wheel이 될 것입니다.

1

대부분의 답글은 현재 날짜를 얻는 방법과 관련이 있습니다. 즉 시스템 클록 등으로부터 발생한다.

어떻게 저장하고 사용하는지 알고 싶으면 여러 가지 구현이 있으며 시스템에 따라 다릅니다.

나는 T-sql에서 64 비트 부호있는 정수를 사용한다고 믿는다. 1970 년 1 월 1 일이 0이므로 음수는 1970 년 이전이고 각 증가분은 100 번째 초 확인해야 할 100 번째라고 생각합니다.)

왜 01/01/1970인지는 그레고리력이 400 년 주기로되어 있기 때문입니다. 01/01/1970은 현재 날짜에 대한주기의 마감입니다.

"매년 정확히 4로 나눌 수있는 윤년은 100으로 정확하게 나눌 수있는 년을 제외하고는 400으로 정확하게 나눌 수있는 백년입니다. 예를 들어, 연도 1900 년은 윤년이 아니며 2000 년은 윤년입니다. " 400 년주기가 반복되는 요일과 일치한다고 생각하지만 매우 복잡합니다. 기본적으로 매우 복잡합니다.

내부적으로 윤년과 같은 이러한 모든 변형을 설명하는 datetime 라이브러리를 작성하는 것은 믿을 수 없을만큼 어렵습니다. 실제로 연도가 0이 아닙니다 ..... UTC, GMT UT1 시간은 말할 것도 없습니다.

1

우리는 클라이언트 문제를 디버깅 할 때 SQL이 datetimes를 저장하는 방법을 보았을 때 꽤 흥미 롭고 꽤 쉽게 이해할 수있었습니다.

SQL은 2 개의 4 바이트 정수를 사용합니다 ... 처음 4 바이트는 1753 년 1 월 1 일 이후의 날짜입니다. 최대 연도는 9999로 가정합니다. 사용할 수있는 정수의 수는 4 바이트이지만 거기에 있습니다. 두 번째 4 바이트는 자정 이후의 시간 (밀리 초)입니다.

관련 문제