맨위로가기

유닉스 시간

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

유닉스 시간은 1970년 1월 1일 00:00:00 협정 세계시(UTC)부터 경과한 시간을 초 단위로 나타낸 것이다. 대부분의 시스템에서 윤초를 무시하고 1970년 1월 1일 00:00:00 UTC를 기준으로 경과된 초의 수를 정수로 표현하며, 이를 '유닉스 시대'라고 한다. 유닉스 시간은 32비트 정수를 사용하는 경우 2038년 문제와 같은 날짜 표현의 한계를 가지며, 64비트 정수를 사용하면 더 넓은 범위의 날짜를 표현할 수 있다. 유닉스 시간은 C, C++, 자바, 파이썬, 자바스크립트 등 다양한 프로그래밍 언어와 운영체제에서 널리 사용되며, 파일 시스템, 데이터베이스 등에서도 타임스탬프 저장에 활용된다.

더 읽어볼만한 페이지

  • 유닉스 - 유닉스 계열
    유닉스 계열은 유닉스 운영체제의 특징과 설계를 공유하는 운영체제들을 지칭하며, 유전적, 상표, 기능적 유닉스로 분류되고 macOS는 상표 유닉스이자 유전적 유닉스에 해당하며 리눅스는 기능적 유닉스의 대표적인 예이다.
  • 유닉스 - ZFS
    ZFS는 Jeff Bonwick 등이 설계하고 구현한 파일 시스템으로, 데이터 무결성, 스냅샷, RAID-Z 등의 기능을 제공하며, 썬 마이크로시스템즈에서 개발되어 OpenZFS 프로젝트를 통해 다양한 운영체제에서 사용된다.
유닉스 시간
지도 정보
기본 정보
다른 이름Epoch time
POSIX 시간
seconds since the Epoch
Unix timestamp
UNIX Epoch time
정의
정의1970년 1월 1일 0시 0분 0초 UTC부터의 경과 시간을 초 단위로 나타내는 시스템
시작점1970년 1월 1일 00:00:00 협정 세계시 (UTC)
기술적 특징
값의 종류부호 있는 정수
측정 단위초 (s)
윤초 처리윤초는 일반적으로 유닉스 시간에 포함되지 않음
시스템 (예: Linux 시스템 등의 GNU C 라이브러리 (glibc))은 tz database를 이용하여 실제 경과 시간 기반으로 변경 가능
이 경우, 최신 윤초 정보를 가져와 시스템에 반영해야 함
시간 표현현재 시간은 입니다.
마지막 갱신 시간 (한국)(이 페이지가 마지막으로 생성된 UNIX 시간)
마지막 갱신 시간 (사용자)(이 페이지가 사용자의 컴퓨터에서 마지막으로 갱신된 시각을 표시합니다)
참고초 단위 시간은 The Open Group Base Specifications Issue 7의 4.15항에 정의됨
사용 예시
프로그래밍대부분의 운영 체제 및 프로그래밍 언어에서 지원
시간 관련 데이터 처리 및 저장에 널리 사용
파일 시스템파일의 생성, 수정, 접근 시간 등의 시간 정보 저장에 사용
데이터베이스데이터 레코드의 시간 정보 추적에 사용
네트워크 프로토콜시간 동기화 및 메시지 타임스탬프에 사용

2. 정의

유닉스 시간은 1970년 1월 1일 00:00:00 UTC부터 경과한 시간을 초 단위로 나타낸 스칼라 실수이다.[58] 이 값은 일반적으로 부호 있는 정수로 인코딩된다.[3]

유닉스 시간 0은 1970년 1월 1일 00:00:00 UTC를 나타내며, 이후 윤초를 제외한 매 초마다 1씩 증가한다. 1971년 1월 1일 00:00:00 UTC는 유닉스 시간으로 31536000으로 표현된다. 음수 값은 1970년 이전의 시간을 나타내며, 윤초를 제외한 매 초마다 값이 1씩 감소한다. 1969년 1월 1일 00:00:00 UTC는 유닉스 시간으로 -31536000으로 표현된다. 유닉스 시간에서 매일은 정확히 86400초로 구성된다.

유닉스 시간은 '시대 시간'이라고도 불리지만, 이는 오해의 소지가 있다. 유닉스 시간은 시대를 기반으로 하는 유일한 시간 시스템이 아니며, 유닉스 시대는 다른 시간 시스템에서 사용되는 유일한 시대가 아니기 때문이다.[5]

1972년 1월 1일 이전의 유닉스 시간 값의 의미는 정확하게 정의되지 않았다. 이 시기의 유닉스 시간은 UTC의 근사치로 이해하는 것이 좋다. 당시 컴퓨터는 초 단위 이하의 정밀한 타임스탬프를 제공할 만큼 정확하지 않았다. 따라서, 초 단위 이하의 정밀도가 필요한 경우 1972년 이전의 시간을 나타내는 데 유닉스 시간을 사용하는 것은 적합하지 않다.

대부분의 시스템에서 유닉스 시간은 협정 세계시(UTC)를 기준으로 1970년 1월 1일 0시 0분 0초(UNIX 에포크)부터 경과된 초를 계산한 값과 같다. 단, 윤초는 무시한다. 따라서 윤초 1초가 삽입된 시각을 포함한 2초 동안 UNIX 시간 값은 1초만 증가한다.

윤초 1초가 삽입된 시각을 포함한 UNIX 시간의 예
협정 세계시 (UTC)UNIX 에포크부터의
실제 경과 초수
UNIX 시간
1998-12-31T23:59:59915148820915148799
1998-12-31T23:59:60915148821915148800
1999-01-01T00:00:00915148822915148800
1999-01-01T00:00:01915148823915148801


2. 1. 윤초 문제

유닉스 시간은 협정 세계시(UTC)와 국제원자시(TAI)의 윤초 처리 방식과 다르다.[3] UTC는 원자시계로 측정한 정확한 시간과 태양의 위치와 관련된 태양시 간의 차이를 조정하기 위해 윤초를 포함한다. 매일 정확히 86400초인 국제원자시(TAI)는 태양시를 무시하며 지구 자전과의 동기화가 매년 약 1초씩 점차 느려진다. 유닉스 시간에서는 매일 정확히 86400초이다. 각 윤초는 바로 앞이나 뒤의 초의 타임스탬프를 사용한다.[3]

일반적인 UTC 시간(시간 길이 86400초)에는 유닉스 시간 값이 자정을 지나면서 연속적으로 변한다. 예를 들어, 2004년 9월 17일 자정(윤초 없음)의 경우 시간 표현은 다음과 같이 진행된다.

유닉스 시간: 2004년 9월 17일 자정(윤초 없음)
TAI (2004년 9월 17일)UTC (2004년 9월 16일~17일)유닉스 시간
2004-09-17T00:00:30.752004-09-16T23:59:58.751095379198.75
2004-09-17T00:00:31.002004-09-16T23:59:59.001095379199.00
2004-09-17T00:00:31.252004-09-16T23:59:59.251095379199.25
2004-09-17T00:00:31.502004-09-16T23:59:59.501095379199.50
2004-09-17T00:00:31.752004-09-16T23:59:59.751095379199.75
2004-09-17T00:00:32.002004-09-17T00:00:00.001095379200.00
2004-09-17T00:00:32.252004-09-17T00:00:00.251095379200.25
2004-09-17T00:00:32.502004-09-17T00:00:00.501095379200.50
2004-09-17T00:00:32.752004-09-17T00:00:00.751095379200.75
2004-09-17T00:00:33.002004-09-17T00:00:01.001095379201.00
2004-09-17T00:00:33.252004-09-17T00:00:01.251095379201.25



윤초가 발생하면 UTC 시간의 길이가 86400초가 아니며, 유닉스 시간 값은 불연속성을 보인다. 윤초는 양수 또는 음수일 수 있다. 음수 윤초는 선언된 적이 없지만, 음수 윤초가 있다면 음수 윤초가 있는 하루가 끝날 때 유닉스 시간 값은 다음 날 시작 시점으로 1 증가한다. 평균적으로 약 1년 반마다 발생하는 하루의 끝에서 양수 윤초 동안에는 유닉스 시간 값이 윤초 동안 다음 날로 연속적으로 증가한 다음 윤초가 끝날 때 1 감소한다(다음 날 시작으로 돌아옴). 예를 들어, 1998년 말에 발생한 양수 윤초의 경우, POSIX.1 시스템에서 시간 표현은 다음과 같이 진행된다.

유닉스 시간: 1999년 1월 1일 자정(양수 윤초)
TAI (1999년 1월 1일)UTC (1998년 12월 31일~1999년 1월 1일)유닉스 시간
1999-01-01T00:00:29.751998-12-31T23:59:58.75915148798.75
1999-01-01T00:00:30.001998-12-31T23:59:59.00915148799.00
1999-01-01T00:00:30.251998-12-31T23:59:59.25915148799.25
1999-01-01T00:00:30.501998-12-31T23:59:59.50915148799.50
1999-01-01T00:00:30.751998-12-31T23:59:59.75915148799.75
1999-01-01T00:00:31.001998-12-31T23:59:60.00915148800.00
1999-01-01T00:00:31.251998-12-31T23:59:60.25915148800.25
1999-01-01T00:00:31.501998-12-31T23:59:60.50915148800.50
1999-01-01T00:00:31.751998-12-31T23:59:60.75915148800.75
1999-01-01T00:00:32.001999-01-01T00:00:00.00915148800.00
1999-01-01T00:00:32.251999-01-01T00:00:00.25915148800.25
1999-01-01T00:00:32.501999-01-01T00:00:00.50915148800.50
1999-01-01T00:00:32.751999-01-01T00:00:00.75915148800.75
1999-01-01T00:00:33.001999-01-01T00:00:01.00915148801.00
1999-01-01T00:00:33.251999-01-01T00:00:01.25915148801.25



양수 윤초 바로 다음 초에는 유닉스 시간 값이 반복된다. 따라서 유닉스 시간 값 915148800.00은 모호하며, 윤초 시작(1998년 12월 31일 23:59:60) 또는 1초 후 끝(1999년 1월 1일 00:00:00)을 의미할 수 있다. 음수 윤초가 발생하는 이론적인 경우에는 모호성이 발생하지 않지만, 대신 UTC 시간의 어떤 시점에도 해당하지 않는 유닉스 시간 값 범위가 있다.

유닉스 시계는 종종 네트워크 시간 프로토콜(NTP)과 관련된 다른 유형의 양수 윤초 처리와 함께 구현되는데, 이는 POSIX 표준을 준수하지 않는 시스템을 생성한다.

윤초를 포함하지 않는 기간을 처리할 때 두 유닉스 시간 값의 차이는 해당 시점 사이의 기간(초)과 같다. 그러나 윤초가 발생하는 경우 이러한 계산은 잘못된 값을 제공한다. 따라서, 정확한 시간 계산이 필요한 응용 프로그램에서는 유닉스 시간을 처리할 때 윤초 표를 참조해야 하며, 다른 시간 인코딩을 사용하는 것이 좋다.

유닉스 시간 값은 유닉스 시간 값을 86400으로 나눈 몫과 나머지를 구하여 UTC 시간으로 쉽게 변환할 수 있다. 몫은 에포크 이후의 일수이고, 나머지는 그날 자정 UTC 이후의 초 수이다. 양수 윤초로 인해 모호한 유닉스 시간 값이 주어지면 이 알고리즘은 자정 직후의 시간으로 해석한다. 윤초 동안의 시간은 절대 생성하지 않는다. 음수 윤초로 인해 잘못된 유닉스 시간 값이 주어지면 마찬가지로 잘못된 UTC 시간을 생성한다. 이러한 조건이 중요한 경우 윤초 표를 참조하여 이를 감지해야 한다.

대부분의 시스템에서는 협정 세계시(UTC)를 기준으로 1970년 1월 1일 0시 0분 0초(UNIX 에포크)부터 경과된 초를 계산한 값과 유닉스 시간이 같다. 단, 윤초는 무시하고 형식적인 차이만 계산한다. 따라서 윤초 1초가 삽입된 시각을 포함한 2초 동안 UNIX 시간 값은 1초만 증가한다.

윤초 1초가 삽입된 시각을 포함한 UNIX 시간의 예
협정 세계시 (UTC)UNIX 에포크부터의
실제 경과 초수
UNIX 시간
1998-12-31T23:59:59915148820915148799
1998-12-31T23:59:60915148821915148800
1999-01-01T00:00:00915148822915148800
1999-01-01T00:00:01915148823915148801


2. 2. 윤초 처리 방식의 변형

일부 시스템에서는 네트워크 시간 프로토콜(NTP)과 관련된 방식으로 윤초를 처리하여 POSIX 표준을 준수하지 않는 경우가 있다.[3] 드물게 윤초를 포함하여 모든 초의 값을 증가시키는 비표준 변형도 존재한다.[7]

일반적으로 밀스 스타일의 유닉스 시계는 유닉스 시간 번호의 변경과 동기화되지 않은 윤초 처리를 사용하여 구현된다. 윤초가 발생해야 하는 경우 시간 번호는 처음에 감소한 다음 윤초 1초 후에 올바른 시간으로 도약한다. 이는 구현을 더 쉽게 하며, 밀스의 논문에서 설명한다.[6] 양의 윤초가 발생할 때 다음과 같은 일이 발생한다.

비동기식 밀스 스타일 유닉스 시계
1999년 1월 1일 자정으로 넘어가는 시점(양의 윤초)
TAI (1999년 1월 1일)UTC (1998년 12월 31일 ~ 1999년 1월 1일)상태유닉스 시계
1999-01-01T00:00:29.751998-12-31T23:59:58.75TIME_INS915148798.75
1999-01-01T00:00:30.001998-12-31T23:59:59.00TIME_INS915148799.00
1999-01-01T00:00:30.251998-12-31T23:59:59.25TIME_INS915148799.25
1999-01-01T00:00:30.501998-12-31T23:59:59.50TIME_INS915148799.50
1999-01-01T00:00:30.751998-12-31T23:59:59.75TIME_INS915148799.75
1999-01-01T00:00:31.001998-12-31T23:59:60.00TIME_INS915148800.00
1999-01-01T00:00:31.251998-12-31T23:59:60.25TIME_OOP915148799.25
1999-01-01T00:00:31.501998-12-31T23:59:60.50TIME_OOP915148799.50
1999-01-01T00:00:31.751998-12-31T23:59:60.75TIME_OOP915148799.75
1999-01-01T00:00:32.001999-01-01T00:00:00.00TIME_OOP915148800.00
1999-01-01T00:00:32.251999-01-01T00:00:00.25TIME_WAIT915148800.25
1999-01-01T00:00:32.501999-01-01T00:00:00.50TIME_WAIT915148800.50
1999-01-01T00:00:32.751999-01-01T00:00:00.75TIME_WAIT915148800.75
1999-01-01T00:00:33.001999-01-01T00:00:01.00TIME_WAIT915148801.00
1999-01-01T00:00:33.251999-01-01T00:00:01.25TIME_WAIT915148801.25



윤초 상태 변수에 주의하면 이를 제대로 디코딩할 수 있다. 이 변수는 윤초가 이미 수행되었는지 여부를 명확하게 나타낸다. 상태 변수 변경은 윤초와 동기화된다.

음의 윤초의 경우에도 비슷한 상황이 발생한다. 건너뛴 초가 약간 늦다. 시스템은 아주 짧은 시간 동안 공칭적으로 불가능한 시간 번호를 표시하지만, TIME_DEL 상태로 감지하고 수정할 수 있다.

이러한 유형의 시스템에서 유닉스 시간 번호는 두 가지 유형의 윤초 모두에서 POSIX를 위반한다. 시간 번호와 함께 윤초 상태 변수를 수집하면 명확하게 디코딩할 수 있으므로, 원하는 경우 올바른 POSIX 시간 번호를 생성하거나 더 적합한 형식으로 전체 UTC 시간을 저장할 수 있다.

이러한 스타일의 유닉스 시계에 대처하는 데 필요한 디코딩 로직은 동일한 인터페이스를 사용하는 가상의 POSIX 준수 시계도 올바르게 디코딩한다. 이는 삽입된 윤초 전체 기간 동안 TIME_INS 상태를 표시한 다음 초 카운트를 반복하는 동안 다음 초 전체 기간 동안 TIME_WAIT 상태를 표시하여 달성된다. 이는 동기식 윤초 처리가 필요하다. 기본 시계가 윤초의 영향을 받지 않는 경우 유닉스 인터페이스를 통해 유닉스 시계 형식으로 UTC 시간을 표현하는 가장 좋은 방법일 것이다.

Unix 시간을 유지하는 또 다른, 훨씬 드문 비표준 변형은 윤초를 포함한 모든 초의 값을 증가시키는 것을 포함한다.[7] 일부 Linux 시스템은 이러한 방식으로 구성된다.[8] 이 방식으로 유지되는 시간은 때때로 "TAI"(타임스케일(TAI)과 UTC 간의 차이가 알려진 시간에 해당하면 타임스탬프를 UTC로 변환할 수 있지만)라고 하며, 윤초를 계산하지 않는 시스템에서는 모든 UTC 시간 값에 고유한 참조가 있는 것은 아니기 때문에 "UTC"와 대조된다.[8]

TAI에는 윤초가 없고 모든 TAI 일은 정확히 86400초이기 때문에, 이 인코딩은 실제로 1970년 1월 1일 00시 00분 10초 TAI 이후 경과된 초를 순수하게 선형적으로 계산한 것이다. 이는 시간 간격 연산을 훨씬 쉽게 만든다. 이러한 시스템의 시간 값은 엄격하게 준수하는 POSIX 시스템이나 NTP 기반 시스템이 가지는 모호성을 겪지 않는다.

이러한 시스템에서는 UTC와 의사 Unix 시간 표현 간의 변환을 올바르게 수행하려면 윤초 표를 참조해야 한다. 이는 평시로 변환하기 위해 시간대 표를 참조해야 하는 방식과 유사하다. IANA 시간대 데이터베이스에는 윤초 정보가 포함되어 있으며, 동일한 소스에서 사용할 수 있는 샘플 코드는 해당 정보를 사용하여 TAI 기반 타임스탬프와 현지 시간 간에 변환한다. 변환은 1972년 현재 형태의 UTC가 시작되기 전(아래 UTC 기준 섹션 참조)에도 정의 문제에 부딪힌다.

이 시스템은 표면적으로 유사하지만 Unix 시간이 아니다. 이 시스템은 POSIX 시간 값과 수 초 차이가 나는 값으로 시간을 인코딩한다. 에포크가 1970년 1월 1일 00시 00분 10초 TAI가 아니라 1970년 1월 1일 00시 00분 00초 TAI인 이 시스템의 버전은 ISO C의 C 날짜 및 시간 함수에 포함시키기 위해 제안되었지만, 2011년에 UTC 부분만 승인되었다.[9] 하지만 C++20에는 관련 함수가 있다.

3. 표현 및 한계

유닉스 시간은 두 단계의 부호화를 거쳐 구성된다. 첫 단계에서는 1970년 1월 1일 00:00:00 UTC부터 경과한 시간을 스칼라 실수로 나타낸다.[58] 두 번째 단계에서는 그 실수를 이진수나 십진수로 부호화한다.

유닉스 시간은 1970년 1월 1일 목요일 00:00:00 UTC부터 경과된 윤초를 제외한 초의 수로 정의되며, '유닉스 시대'라고 불린다.[3] 일반적으로 부호 있는 정수로 인코딩된다. 유닉스 시간 0은 1970년 1월 1일 00:00:00 UTC이며, 이후 윤초를 제외한 매 초마다 1씩 증가한다. 시스템에서 지원하는 경우 음수 값은 유닉스 시대 이전의 시간을 나타내며, 매 초마다 1씩 감소한다. 예를 들어, 1969년 1월 1일 00:00:00 UTC는 -31536000으로 표현된다. 유닉스 시간에서 매일은 정확히 86400초로 구성된다.

유닉스 시간은 협정 세계시(UTC)와 국제원자시(TAI)의 윤초 처리 방식과 다르다. UTC는 원자시계로 측정한 정확한 시간과 태양시 간의 차이를 조정하기 위해 윤초를 포함한다. 반면, 매일 정확히 86400초인 국제원자시(TAI)는 태양시를 무시하며 지구 자전과의 동기화가 매년 약 1초씩 느려진다. 유닉스 시간에서는 매일 정확히 86400초이며, 각 윤초는 바로 앞이나 뒤의 초의 타임스탬프를 사용한다.[3]

일반적인 UTC 시간(시간 길이 86400초)에는 유닉스 시간 값이 자정을 지나면서 연속적으로 변한다.

유닉스 시간: 2004년 9월 17일 자정(윤초 없음)
TAI (2004년 9월 17일)UTC (2004년 9월 16일~17일)유닉스 시간
2004-09-17T00:00:30.752004-09-16T23:59:58.751095379198.75
2004-09-17T00:00:31.002004-09-16T23:59:59.001095379199.00
2004-09-17T00:00:31.252004-09-16T23:59:59.251095379199.25
2004-09-17T00:00:31.502004-09-16T23:59:59.501095379199.50
2004-09-17T00:00:31.752004-09-16T23:59:59.751095379199.75
2004-09-17T00:00:32.002004-09-17T00:00:00.001095379200.00
2004-09-17T00:00:32.252004-09-17T00:00:00.251095379200.25
2004-09-17T00:00:32.502004-09-17T00:00:00.501095379200.50
2004-09-17T00:00:32.752004-09-17T00:00:00.751095379200.75
2004-09-17T00:00:33.002004-09-17T00:00:01.001095379201.00
2004-09-17T00:00:33.252004-09-17T00:00:01.251095379201.25



윤초가 발생하면 UTC 시간의 길이가 86400초가 아니며, 유닉스 시간 값은 불연속성을 경험하게 된다. 양수 윤초 동안에는 유닉스 시간 값이 윤초 동안 다음 날로 연속적으로 증가한 다음 윤초가 끝날 때 1 감소한다(다음 날 시작으로 돌아옴).

유닉스 시간: 1999년 1월 1일 자정(양수 윤초)
TAI (1999년 1월 1일)UTC (1998년 12월 31일~1999년 1월 1일)유닉스 시간
1999-01-01T00:00:29.751998-12-31T23:59:58.75915148798.75
1999-01-01T00:00:30.001998-12-31T23:59:59.00915148799.00
1999-01-01T00:00:30.251998-12-31T23:59:59.25915148799.25
1999-01-01T00:00:30.501998-12-31T23:59:59.50915148799.50
1999-01-01T00:00:30.751998-12-31T23:59:59.75915148799.75
1999-01-01T00:00:31.001998-12-31T23:59:60.00915148800.00
1999-01-01T00:00:31.251998-12-31T23:59:60.25915148800.25
1999-01-01T00:00:31.501998-12-31T23:59:60.50915148800.50
1999-01-01T00:00:31.751998-12-31T23:59:60.75915148800.75
1999-01-01T00:00:32.001999-01-01T00:00:00.00915148800.00
1999-01-01T00:00:32.251999-01-01T00:00:00.25915148800.25
1999-01-01T00:00:32.501999-01-01T00:00:00.50915148800.50
1999-01-01T00:00:32.751999-01-01T00:00:00.75915148800.75
1999-01-01T00:00:33.001999-01-01T00:00:01.00915148801.00
1999-01-01T00:00:33.251999-01-01T00:00:01.25915148801.25



유닉스 시간은 숫자를 나타낼 수 있는 모든 형태로 표현될 수 있다. 특히 중요한 이진 표현은 시간을 나타내는 유닉스 `time_t` 데이터 형식으로, 많은 플랫폼에서 전통적으로 32비트 부호 있는 정수를 사용한다. 이 방식은 1901년 12월 13일부터 2038년 1월 19일까지 표현 가능하다.

초 이하의 정밀도를 가진 시간은 `time_t`(유닉스 시간의 정수 부분)와 소수 부분(백만분의 일(struct timeval) 또는 십억분의 일(struct timespec))으로 구성된 복합 데이터 형식을 사용한다.[10][11]

3. 1. 2038년 문제

32비트 유닉스 시간 오버플로우 문제(2038년 발생 예정) 애니메이션


많은 플랫폼에서 시간을 나타내는 유닉스 time_t 데이터 형식은 전통적으로 32비트 부호 있는 정수이다.[10] 이 방식으로는 1901년 12월 13일 금요일부터 2038년 1월 19일 화요일까지 표현이 가능하다. 2038년 1월 19일 03시 14분 07초(UTC) 이후 1초가 지나면, 이 표현은 오버플로되어 2038년 문제가 발생한다.[10]

일부 최신 운영 체제에서는 `time_t`가 64비트로 확장되었다.[10] 이는 양방향으로 약 292,277,264,695년을 표현할 수 있게 해주는데, 이는 현재 우주의 나이의 20배가 넘는다.[10]

64비트 유닉스 시간 표현에서는 날짜 범위 제한이 문제가 되지 않는다. 부호 있는 64비트 정수에 저장된 유닉스 시간으로 표현할 수 있는 날짜의 실제 범위는 5,840억 년이 넘거나 1970년 에포크를 기준으로 양쪽 방향으로 2,920억 년이다.[32]

표현 가능한 날짜 범위
값의 형식시간 단위날짜 하한날짜 상한
int321901년 12월 13일 20시 45분 52초2038년 1월 19일 3시 14분 7초
int64기원전 2.9e11년서기 2.9e11년[51]
밀리초기원전 2.9e8년서기 2.9e8년[51]
마이크로초기원전 290301년서기 294241년[51]
나노초1677년 9월 21일 00시 12분 43.145224192초2262년 4월 11일 23시 47분 16.854775807초[52]


4. 역사

초기 유닉스 시간은 하드웨어 시스템 클럭 속도인 60 Hz로 증가하는 32비트 정수였다.[13][14] 이 방식으로는 2년 3개월 정도의 시간만 나타낼 수 있었다. 초기 유닉스 시간 정의에는 표준 시간대도 없었다.[13][14] 유닉스 초기 개발 중에는 기준 시점이 여러 번 변경되었는데, 1971년 1월 1일 자정과 1972년 1월 1일 자정이 모두 사용되었다.

현재 기준 시점인 1970년 1월 1일 00:00:00 UTC는 유닉스 엔지니어들이 임의로 선택한 것이다.

POSIX.1 작성 당시 윤초를 고려하여 `time_t`를 정의하는 문제가 있었다. POSIX 위원회는 유닉스 시간을 기준 시점 이후의 초를 선형적으로 계산하는 방식을 유지할지, 아니면 일반 시간과의 변환 복잡성을 감수할지 등을 고려했다. 당시 컴퓨터 시계는 충분히 정확하지 않았다.

POSIX 위원회는 유닉스 시간을 UTC 시간 요소로 간단하게 정의했다. 이 정의는 그레고리력의 윤년 규칙 전체를 포함하지 않아 2100년을 윤년으로 만들었다.

2001년판 POSIX.1은 유닉스 시간 정의에서 잘못된 윤년 규칙을 수정했지만, 유닉스 시간을 선형 시간 척도가 아닌 UTC의 인코딩으로 하는 기본 정의는 유지했다. 1990년대 중반 이후 컴퓨터 시계는 대부분 UTC 기반 유닉스 시간 정의를 사용했다. 이로 인해 유닉스 구현과 네트워크 시간 프로토콜에서 윤초 발생 시 유닉스 시간 번호에서 단계를 실행하는 복잡성이 발생했다.

5. 활용

유닉스 시간은 유닉스 시스템 시간으로 사용될 뿐만 아니라, 컴퓨팅 분야에서 널리 활용된다. 유닉스 기반 시스템과 비유닉스 운영 체제 모두에서 제공되는 거의 모든 시스템 프로그래밍 API에서 사용되며, 대부분의 최신 프로그래밍 언어는 유닉스 시간을 사용하거나 다른 데이터 구조로 변환하기 위한 API를 제공한다. 또한, 여러 파일 시스템, 파일 형식, 데이터베이스에서 타임스탬프를 저장하는 방식으로도 쓰인다.[15]

C 표준 라이브러리는 모든 날짜 및 시간 함수에 유닉스 시간을 사용하며, CC++에서는 타임스탬프에 사용되는 데이터 형식을 time_t라고 부르기도 한다. C의 유닉스 시간 함수는 POSIX 규격에서 시스템 시간 API로 정의되어 있으며, 마이크로소프트 윈도우, macOS, 리눅스 등 다양한 운영 체제에서 표준 프로그래밍 인터페이스로 널리 사용된다.[16][17][18]

iOS는 2001년 1월 1일을 기준 시점으로 사용하는 Swift API를 제공하지만, 유닉스 타임스탬프와 함께 사용할 수도 있다.[19] 안드로이드는 시스템 시간 API에 유닉스 시간과 표준 시간대를 함께 사용한다.[20] Windows는 내부적으로 유닉스 시간을 사용하지 않지만, C++로 제공되고 C 표준 라이브러리 규격을 구현하는 시스템 API에서는 유닉스 시간을 사용한다.[16] 유닉스 시간은 Windows 실행 파일의 PE 형식에도 사용된다.[21]

자바는 초와 나노초 단위의 유닉스 타임스탬프를 저장하는 Instant 객체를 제공하며, 파이썬은 유닉스 시간을 사용하는 time 라이브러리를 제공한다.[22][23] 자바스크립트는 유닉스 에포크 이후 밀리초 단위의 타임스탬프를 제공하고 저장하는 Date 라이브러리를 제공하며, 이는 대부분의 웹 브라우저와 Node.js와 같은 자바스크립트 서버 환경에서 구현된다.[24]

APFS(Apple 기기에서 기본 사용)와 ext4(리눅스 및 안드로이드 기기에서 널리 사용) 등 유닉스 기반 운영 체제용으로 설계된 파일 시스템은 파일 타임스탬프에 나노초 단위의 유닉스 시간을 사용한다.[25][26] RAR 및 tar 등 여러 압축 파일 형식도 유닉스 시간으로 타임스탬프를 저장할 수 있다.[27][28] MySQLPostgreSQL 등 데이터베이스에서도 타임스탬프 저장에 유닉스 시간이 널리 사용된다.[29][30]

5. 1. 한국 표준시(KST)와의 관계

한국 표준시(KST)는 협정 세계시(UTC)보다 9시간 빠르기 때문에, 유닉스 시간을 KST로 변환하려면 9시간(32400초)을 더해야 한다. 한국의 여러 시스템에서는 유닉스 시간을 사용하여 시간을 표시하고, KST와의 변환 기능을 제공한다.[31]

유닉스 시간과 한국 표준시(KST) 간의 변환 예
유닉스 시간협정 세계시 (UTC)한국 표준시 (KST)
01970-01-01T00:00:001970-01-01T09:00:00
1000000001973-03-03T09:46:401973-03-03T18:46:40
10000000002001-09-09T01:46:402001-09-09T10:46:40
12345678902009-02-13T23:31:302009-02-14T08:31:30
21474836472038-01-19T03:14:072038-01-19T12:14:07


6. 주요 사건

유닉스 애호가들은 유닉스 시간 값의 중요한 시점을 기념하기 위해 "time_t 파티" ("time 티 파티"라고 발음)를 여는 역사를 가지고 있다.[38][39] 이는 새해 기념 행사와 유사하다. 유닉스 시간 사용이 확산되면서 이러한 중요 시점을 기념하는 관행도 확산되었다. 일반적으로 `time_t` 값을 십진수로 보는 유닉스 관례에 따라 십진수로 둥근 숫자 값이 기념된다.

이러한 행사는 "유닉스 에폭 이후 ''N''초"로 설명되지만, 이는 정확하지 않다. 유닉스 시간에서 윤초 처리로 인해 유닉스 에폭 이후 경과된 초의 수는 에폭 이후 시간에 대한 유닉스 시간 값보다 약간 더 크다.

주요 사건들은 다음과 같다.

일시사건 내용
1973년 10월 17일 수요일 UTC 18:36:57유닉스 시간(119731017) 자릿수 내에 ISO 8601 형식의 날짜가 처음으로 나타났다.
2001년 9월 9일 일요일 UTC 01:46:40유닉스 빌리니엄(유닉스 시간 1000000000)이 기념되었다.[40] "빌리니엄"이라는 이름은 "십억"과 "밀레니엄"의 혼성어이다.[41][42]
2009년 2월 13일 금요일 UTC 23:31:30유닉스 시간의 십진수 표현이 1234567890초에 도달했다.[44] 구글은 이를 구글 두들로 기념했다.[45] 다양한 기술적 하위 문화권에서 전 세계적으로 파티와 기타 기념 행사가 열렸다.[38][46]


7. 프로그래밍 언어 및 셸에서의 사용 예

C 표준 라이브러리는 모든 날짜 및 시간 함수에 유닉스 시간을 사용하며, 유닉스 시간은 때때로 CC++에서 타임스탬프에 사용되는 데이터 형식의 이름인 time_t라고도 한다. C의 유닉스 시간 함수는 POSIX 사양에서 시스템 시간 API로 정의되어 있다.[15] C 표준 라이브러리는 마이크로소프트 윈도우와 macOS, 리눅스와 같은 유닉스 계열 시스템을 포함한 모든 최신 데스크톱 운영 체제에서 광범위하게 사용되며, 표준 프로그래밍 인터페이스이다.[16][17][18]

iOS는 2001년 1월 1일을 기준 시점으로 사용하는 Swift API를 제공하지만 유닉스 타임스탬프와 함께 사용할 수도 있다.[19] 안드로이드는 시스템 시간 API에 유닉스 시간과 표준 시간대를 함께 사용한다.[20] Windows는 내부적으로 시간을 저장하는 데 유닉스 시간을 사용하지 않지만, C++로 제공되고 C 표준 라이브러리 사양을 구현하는 시스템 API에서 유닉스 시간을 사용한다.[16] 유닉스 시간은 Windows 실행 파일의 PE 형식에 사용된다.[21]

유닉스 시간은 주요 프로그래밍 언어에서 일반적으로 사용 가능하며 데스크톱, 모바일 및 웹 애플리케이션 프로그래밍에서 널리 사용된다. 자바는 초와 나노초 단위의 유닉스 타임스탬프를 저장하는 Instant 객체를 제공한다.[22] 파이썬은 유닉스 시간을 사용하는 time 라이브러리를 제공한다.[23] 자바스크립트는 유닉스 에포크 이후 밀리초 단위의 타임스탬프를 제공하고 저장하는 Date 라이브러리를 제공하며, 모든 최신 데스크톱 및 모바일 웹 브라우저Node.js와 같은 자바스크립트 서버 환경에서 구현된다.[24]

유닉스/리눅스에서 유닉스 시간을 UTC로 변환하는 예는 다음과 같다.

```

date -u -d '@1234567890'

```

*BSD의 셸에서 유닉스 시간을 UTC로 변환하는 예는 다음과 같다.

```

date -jr '1234567890'

```

유닉스/리눅스의 셸에서 유닉스 시간을 로컬 시간으로 변환하는 예는 다음과 같다.

```

date -d '@1234567890'

```

*BSD의 셸에서 유닉스 시간을 로컬 시간으로 변환하는 예는 다음과 같다.

```

date -j '+%s'

```

웹 브라우저의 주소 표시줄(URL 란)에 자바스크립트를 입력하여 유닉스 시간을 표시하는 예는 다음과 같다(파이어폭스 6.0 이상에서는 스크래치패드).

```

javascript:window.alert(Math.floor((new Date()).getTime()/1000))

```

C언어로 현재 유닉스 시간을 표시하는 프로그램은 다음과 같다.



#include

#include

int main(void)

{

time_t now;

now = time(NULL);

printf("%lld", (long long)now);

return 0;

}


참조

[1] 잡지 Unix Tick Tocks to a Billion https://www.wired.co[...] 2022-10-16
[2] 웹사이트 The Open Group Base Specifications Issue 7, Rationale: Base Definitions, section A.4 General Concepts https://pubs.opengro[...] The Open Group 2019-09-09
[3] 웹사이트 The Open Group Base Specifications Issue 7, section 4.16 Seconds Since the Epoch http://pubs.opengrou[...] The Open Group 2017-01-22
[4] 서적 Beginning Linux Programming Wiley
[5] 웹사이트 FILETIME structure (minwinbase.h) https://learn.micros[...] 2021-04-02
[6] 웹사이트 The NTP Timescale and Leap Seconds https://www.eecis.ud[...] 2012-05-12
[7] 웹사이트 Precision timekeeping https://www.iana.org[...] 2022-05-30
[8] 웹사이트 Time Scales https://support.ntp.[...] 2019-07-24
[9] 웹사이트 Modernized API for ISO C https://www.cl.cam.a[...]
[10] 웹사이트 timespec https://netbsd.gw.co[...] 2011-04-12
[11] 웹사이트 time.h(0P) http://man7.org/linu[...]
[12] 서적 TIME—From Earth Rotation to Atomic Physics Wiley–VCH Verlag GmbH & Co. KGaA 2009
[13] 서적 Unix Programmer's Manual https://www.bell-lab[...] 1971-11-03
[14] 서적 Unix Programmer's Manual http://bitsavers.org[...] 1972-03-15
[15] 웹사이트 The Open Group Technical Standard Base Specifications Issue 7 (2018 edition) https://pubs.opengro[...] IEEE and The Open Group
[16] 웹사이트 time, _time32, _time64 https://learn.micros[...] Microsoft Corporation 2023-02-13
[17] 웹사이트 The GNU C Library (glibc) https://www.gnu.org/[...] Free Software Foundation
[18] 웹사이트 Mac OS X Manual Page for localtime(3) https://developer.ap[...] Apple Inc.
[19] 웹사이트 NSDate https://developer.ap[...] Apple Inc.
[20] 웹사이트 Time Overview https://source.andro[...] Google LLC
[21] 웹사이트 PE Format - Win32 apps https://learn.micros[...] Microsoft Corporation 2023-03-24
[22] 웹사이트 Instant (Java Platform SE 8 ) https://docs.oracle.[...] Oracle
[23] 웹사이트 time — Time access and conversions https://docs.python.[...]
[24] 웹사이트 Date - JavaScript {{!}} MDN https://developer.mo[...] Mozilla
[25] 웹사이트 Apple File System Reference https://developer.ap[...]
[26] 웹사이트 Data Structures and Algorithms https://www.kernel.o[...] Linux Kernel Organization, Inc.
[27] 웹사이트 RAR 5.0 archive format https://www.rarlab.c[...] win.rar GmbH
[28] 웹사이트 Tape Archive (tar) File Format Family https://www.loc.gov/[...] Library of Congress 2021-01-07
[29] 웹사이트 Date and Time Functions https://dev.mysql.co[...]
[30] 웹사이트 8.5. Date/Time Types https://www.postgres[...] The PostgreSQL Global Development Group 2023-02-09
[31] 서적 Advanced UNIX Programing Addison-Wesley 2004
[32] 웹사이트 IDRBT Working Paper No. 9 http://www.idrbt.ac.[...]
[33] 웹사이트 FILETIME (minwinbase.h) - Win32 apps https://learn.micros[...] Microsoft 2021-04-02
[34] 웹사이트 File Times - Win32 apps https://learn.micros[...] Microsoft 2021-01-07
[35] 웹사이트 How to convert date/time attributes in Active Directory to standard time format https://learn.micros[...] Microsoft
[36] 서적 UNIX Network Programming https://books.google[...] Addison-Wesley Professional 2016-10-16
[37] 웹사이트 datetime — Basic date and time types https://docs.python.[...] Python Software Foundation 2022-10-20
[38] 잡지 Unix Lovers to Party Like It's 1234567890 https://www.wired.co[...] 2009-02-12
[39] 웹사이트 Slashdot {{!}} date +%s Turning 1111111111 https://slashdot.org[...] 2005-03-17
[40] 웹사이트 Unix time facts & trivia – Unix Time . Info http://unixtime.info[...]
[41] 웹사이트 UNIX Approaches Ripe Old Age of One Billion http://www.electroma[...] Electromagnetic.net 2012-12-06
[42] 저널 The RISKS Digest, Volume 21 Issue 69 http://catless.ncl.a[...] 2001-10-15
[43] 웹사이트 Technical Problems. http://linuxmafia.co[...] 2017-08-21
[44] 웹사이트 Humor: On Feb, Friday 13, 2009 Unix time Will Be 1234567890 https://www.cybercit[...] Cyberciti.biz 2023-07-05
[45] 웹사이트 Google 1234567890 Logo https://www.google.c[...] Google Inc. 2013-01-28
[46] 뉴스 At the third stroke, the Unix time will be 1234567890 https://www.thetimes[...] 2009-02-13
[47] 저널 Languages, Levels, Libraries, and Longevity 2004-12-27
[48] 문서 GPS時刻
[49] 웹사이트 currentTimeMillis - System (Java SE 17 & JDK 17) https://docs.oracle.[...]
[50] 웹사이트 time.time --- 時刻データへのアクセスと変換 — Pythonドキュメント https://docs.python.[...]
[51] 웹사이트 Datetime Units - Datetimes and Timedeltas — NumPy Manual https://numpy.org/do[...]
[52] 웹사이트 Time series / date functionality — pandas documentation https://pandas.pydat[...]
[53] 웹인용 The Open Group Base Specifications Issue 7, section 4.15 Seconds Since the Epoch http://pubs.opengrou[...] The Open Group 2014-05-02
[54] 문서 유닉스 시간의 정의이다. 다만, 값이 음수인 경우는 1970년 1월 1일 이전을 나타낸다.
[55] 웹인용 The Open Group Base Specifications Issue 7, Rationale, section 4.15 Seconds Since the Epoch http://pubs.opengrou[...] The OpenGroup 2014-05-02
[56] 문서 윤초는 국제지구자전연구소가 결정하며, 예측이 불가능하다.
[57] 문서 유닉스 시간이 표현할 수 없는 UTC의 예시는 다음과 같다(e.g. 1998년 12월 31일 23:59:60)
[58] 웹인용 Epoch Converter - Unix Timestamp Converter http://www.epochconv[...] 2017-02-09



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com