사전 타임스탬프
개념

타임스탬프

gabury1

타임스탬프는 어떤 일이 일어난 시각을 적어 둔 값입니다. 일은 지나가면 사라지지만 적어 둔 값은 남습니다. 남은 값끼리 견주면 무엇이 먼저 일어났는지 나중에 따질 수 있습니다.

상세

우체국이 편지 봉투에 찍는 소인은 그 편지를 언제 접수했는지를 봉투 위에 남깁니다. 편지는 이 손 저 손으로 옮겨 다니지만 소인은 접수한 그 순간에 붙어 그대로 따라다닙니다.

타임스탬프에는 세 가지가 있어야 합니다. 시점을 갖는 사건, 그 사건이 일어난 시점, 그리고 그 시점을 적어 둔 값입니다. 셋 중 하나라도 빠지면 타임스탬프가 아닙니다. 값만 덩그러니 있으면 무엇의 시각인지 알 수 없고, 사건만 있고 값이 없으면 지나간 뒤에 따질 방법이 없습니다.

flowchart TD
    A[사건이 일어난다] --> B[그 자리에서 시계를 읽는다]
    B --> C[기준점 위의 값으로 적는다]
    C --> D[값이 사건에 붙어 남는다]
    D --> E[나중에 두 값을 견준다]

값이 뜻을 가지려면 기준점과 세는 단위가 먼저 정해져야 합니다. 기준점을 잡고 거기서 흐른 양을 세는 길이 하나입니다. POSIX(Portable Operating System Interface) 규격의 「Seconds Since the Epoch」 절은 이 값을 에포크 이후 흐른 초의 수에 가까운 값이라고 적습니다. 같은 절은 하루하루가 정확히 86400초로 셈해져야 한다고 못 박습니다. 기준점을 대신 표기 안에 적어 넣는 길이 다른 하나입니다. RFC(Request for Comments) 3339 는 날짜와 시각을 이어 붙인 문자열의 문법을 정합니다. 그 문자열 끝에는 Z 또는 부호가 붙은 오프셋이 옵니다. 어느 기준에서 읽은 시각인지를 값 자신이 들고 있게 하는 자리입니다.

타임스탬프가 가리키는 것은 한 시점입니다. RFC 3339 는 날짜·시각 표현이 시간 위의 한 순간을 가리킨다고 적습니다. 기간이나 구간을 기술하는 일은 이 문서가 다루지 않는다고도 적습니다. 그래서 "9시부터 10시까지" 는 이 값이 담는 것이 아닙니다. 담는다면 9시라는 한 시점과 10시라는 한 시점, 값 두 개입니다.

같은 문서는 인터넷 프로토콜에서 날짜와 시각이 나타나는 여러 방식 가운데 한 가지 흔한 용법에 집중한다고 밝힙니다. 그 용법을 부르는 이름이 인터넷 프로토콜 사건의 타임스탬프입니다. 값이 사건에 붙는다는 것이 이 말의 자리입니다.

배경

사건은 지나가면 사라집니다. 요청 하나가 처리되고 파일 하나가 고쳐지는 동안 그 일이 언제 일어났는지는 그 순간에만 알 수 있습니다. 나중에 로그 두 줄을 놓고 어느 쪽이 먼저였는지 따지려 해도, 일이 벌어진 자리에서 아무것도 안 적어 두었으면 되짚을 근거가 없습니다. 그래서 사건이 일어난 자리에서 시계를 읽어 그 값을 사건에 붙여 둡니다. 붙여 둔 값이 타임스탬프입니다.

그 다음에 온 불편은 적는 방식이 제각각이라는 것이었습니다. RFC 3339 첫머리는 날짜와 시각 형식이 인터넷에서 많은 혼란과 상호운용성 문제를 일으킨다고 적습니다. 이어서 이 문서가 그 문제들을 다뤄 표현과 사용의 일관성·상호운용성을 개선할 권고를 낸다고 밝힙니다. 값을 남기는 쪽과 읽는 쪽이 서로 다른 규칙을 쓰면 값이 남아 있어도 뜻이 통하지 않습니다.

같은 불편이 HTTP(HyperText Transfer Protocol)에도 있었습니다. RFC 9110 은 1995년 이전에 서버들이 타임스탬프를 주고받는 데 흔히 쓰던 형식이 세 가지였다고 적습니다. 지금은 그중 하나를 선호 형식으로 정해 두고 나머지를 구식 형식으로 밀어 두었습니다.

예시

RFC 3339 의 인터넷 날짜·시각 표기

1985-04-12T23:20:50.52Z
1996-12-19T16:39:57-08:00

문법은 date-time = full-date "T" full-time 입니다. 날짜와 시각을 대문자 T 로 잇고, 끝에 time-offset 을 붙입니다. 오프셋 자리는 Z 이거나 ("+" / "-") time-hour ":" time-minute 입니다. 첫 값은 1985년 4월 12일 23시에서 20분 50.52초 지난 시각을 협정 세계시(UTC, Coordinated Universal Time)로 적은 것입니다. 둘째 값은 협정 세계시에서 -08:00 만큼 떨어진 기준으로 읽은 시각입니다. RFC 3339 는 이것이 1996-12-20T00:39:57Z 와 같다고 적어 둡니다. 초 자리 문법에는 00-58, 00-59, 00-60 based on leap second rules 라는 주석이 달려 있습니다.

HTTP 의 Date 헤더

Date: Tue, 15 Nov 1994 08:12:31 GMT

Date 헤더 필드는 그 메시지가 만들어진 날짜와 시각을 나타냅니다. 값의 문법은 HTTP-date = IMF-fixdate / obs-date 입니다. 선호 형식의 예로 Sun, 06 Nov 1994 08:49:37 GMT 가 실려 있습니다. RFC 9110 은 HTTP-date 값이 시간을 협정 세계시의 한 순간으로 나타낸다고 적습니다. 앞의 RFC 3339 표기와 같은 시점을 가리키더라도 적는 글자 배열이 다릅니다.

파일 하나에 붙는 세 타임스탬프

C
struct timespec  st_atim;  /* Time of last access */
struct timespec  st_mtim;  /* Time of last modification */
struct timespec  st_ctim;  /* Time of last status change */

파일 하나에 사건 종류마다 값이 하나씩 붙습니다. st_atime 은 파일 데이터에 마지막으로 접근한 시각, st_mtime 은 파일 데이터를 마지막으로 고친 시각, st_ctime 은 아이노드에 마지막으로 변경이 일어난 시각입니다. 이름이 셋으로 갈린 것은 "고쳤다" 와 "읽었다" 와 "속성이 바뀌었다" 가 서로 다른 사건이기 때문입니다. Linux 2.5.48 이후로 stat 구조체는 이 세 필드에 나노초 해상도를 지원합니다.

PostgreSQL 의 timestamp with time zone

SQL
TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'

컬럼 타입 자체가 타임스탬프를 담는 자리로 정의돼 있습니다. timestamp with time zone 은 8바이트를 씁니다. 담을 수 있는 범위는 4713 BC 부터 294276 AD 까지입니다. 해상도는 1마이크로초입니다. 값 뒤의 +02 가 오프셋입니다. PostgreSQL 공식 문서는 명시적 타임존이 들어간 입력 문자열을 그 타임존의 오프셋으로 협정 세계시로 변환한다고 적습니다. 같은 문서는 어느 경우든 값이 내부적으로 협정 세계시로 저장된다고 적습니다. 원래 적혔거나 가정된 타임존은 보존되지 않습니다.

경계

램포트가 말한 논리 타임스탬프도 여기서 말하는 타임스탬프인가. 아닙니다.

램포트의 1978년 논문은 각 프로세스가 연속한 두 사건 사이에 자기 계수기를 늘리게 합니다. 메시지를 보낼 때는 그 계수기 값을 Tm 이라는 이름으로 메시지에 실어 보내게 합니다. 받는 쪽은 자기 계수기를 지금 값 이상이면서 Tm 보다 큰 값으로 올립니다. 논문은 이 Tm 을 timestamp 라고 부릅니다. 이름은 같습니다.

가르는 선은 값이 기준점 위의 시각을 가리키느냐입니다. 에포크 이후 초는 에포크라는 기준점을 들고 있고, RFC 3339 표기는 오프셋을 값 안에 적어 둡니다. 논리 타임스탬프의 계수기 값에는 그런 기준점이 없습니다. 그 값이 정하는 것은 몇 시냐가 아니라 인과 순서 안에서 어느 자리냐입니다. 단조 시계 값이 이 선 밖에 있는 것도 같은 기준을 다시 대 본 결과입니다. clock_gettime(2) 은 CLOCK_MONOTONIC 을 POSIX 가 말한 "과거의 명시되지 않은 어떤 시점" 이후의 단조 시간을 나타내는 시계라고 적습니다. 같은 문서는 리눅스에서 그 시점이 시스템이 부팅된 뒤 흐른 초의 수에 대응한다고 이어서 적습니다. 그래도 부팅 시점은 달력이 정한 기준점이 아닙니다. 이 값도 몇 시를 가리키지 못합니다.

관련 항목

타임스탬프를 정의하는 표준·문서

POSIX · RFC 3339 · RFC 9110 · ISO 8601

타임스탬프를 가리키는 다른 표기 이름

유닉스 시각 · HTTP-date · IMF-fixdate · obs-date

타임스탬프가 기준으로 삼는 시각

에포크 · 협정 세계시 · 그리니치 표준시

표기 안에 실리는 오프셋과 시간대

UTC 오프셋 · 타임존 · 오프셋

시각을 읽어 오는 시계와 맞추는 프로토콜

벽시계 · 단조 시계 · 시스템 클록 · NTP

타임스탬프를 만들어 내는 시스템 호출과 자료형

clock_gettime · CLOCK_MONOTONIC · time_t

이 값의 초 단위 정밀도와 예외

해상도 · 나노초 · 마이크로초 · 윤초 · 정밀도 · 2038 문제

이 값과 맞세워지는 순서 값

논리 시계 · 램포트 시계 · 벡터 시계 · 시퀀스 번호

타임스탬프가 저장되는 파일 필드와 로그

atime · mtime · ctime · 아이노드 · 로그

타임스탬프를 실어 나르는 HTTP 헤더

Date · Last-Modified · Expires

타임스탬프를 실제로 구현하는 시스템·프로토콜

PostgreSQL · Linux · HTTP

이것이 속하는 상위 영역

시간과 시계

다른 이름: timestamp · 시각 스탬프