Guide

ISO 8601 형식 가이드: 날짜, 시간 및 시간대 표준

ISO 8601이란 무엇입니까?

ISO 8601은 날짜와 시간을 명확하고 모호하지 않은 형식으로 표현하기 위한 국제 표준입니다. ISO(국제 표준화 기구)에서 발표한 이 표준은 전 세계의 다양한 날짜 형식(예: MM/DD/YYYY 대 DD/MM/YYYY)으로 인한 혼란을 제거하고 날짜 및 시간 정보를 교환하는 일관된 방법을 제공합니다.

ISO 8601 형식은 다음과 같은 이유로 API, 데이터베이스 및 웹 애플리케이션에서 널리 사용됩니다.

  • 모호하지 않음: 일/월 순서에 혼동이 없습니다.
  • 정렬 가능: 사전식 정렬이 올바르게 작동합니다.
  • 기계 판독 가능: 컴퓨터가 쉽게 구문 분석할 수 있습니다.
  • 사람이 읽을 수 있음: 여전히 사람이 이해할 수 있음
  • 범용: 모든 시간대와 지역에서 작동합니다.

ISO 8601 형식을 사용하는 이유는 무엇입니까?

'03/04/2024'와 같은 날짜가 표시되면 3월 4일을 의미하나요, 아니면 4월 3일을 의미하나요? 나라마다 이것을 다르게 해석합니다. ISO 8601은 항상 명확한 연-월-일 형식인 2024-04-03 형식을 사용하여 이 문제를 해결합니다.

// Ambiguous formats (avoid these)
"03/04/2024"  // Is this March 4 or April 3?
"4-3-24"      // Is this 2024 or 1924?

// ISO 8601 format (recommended)
"2024-04-03"  // Always April 3, 2024
"2024-04-03T14:30:00Z"  // April 3, 2024, 2:30 PM UTC

ISO 8601 날짜 형식

기본 날짜 형식

표준 ISO 8601 날짜 형식은 'YYYY-MM-DD' 패턴을 따릅니다.

예:

  • 2024-01-15 - 2024년 1월 15일
  • 2024-12-31 - 2024년 12월 31일
  • 2025-06-07 - 2025년 6월 7일
# Python example
from datetime import date

today = date(2024, 4, 15)
iso_date = today.isoformat()  # "2024-04-15"
print(f"ISO 8601 date: {iso_date}")

확장 형식과 기본 형식 비교

ISO 8601은 두 가지 형식을 지원합니다.

  1. 확장 형식(구분자 포함): 2024-04-15
  2. 기본 형식(컴팩트): 20240415

대부분의 애플리케이션은 더 읽기 쉬운 확장 형식을 사용합니다.

// JavaScript example
const date = new Date('2024-04-15');

// Extended format (recommended)
const extended = date.toISOString().split('T')[0];  // "2024-04-15"

// Basic format (compact)
const basic = extended.replace(/-/g, '');  // "20240415"

주간 날짜

ISO 8601YYYY-Www-D 형식을 사용하여 주 기반 날짜도 지원합니다.

  • YYYY: 연도
  • Www: 주 번호(01-53)
  • D: 요일(1=월요일, 7=일요일)

예: '2024-W15-3'은 2024년 15주차 수요일을 의미합니다.

서수 날짜

서수 날짜(연도 중 일자)를 사용할 수도 있습니다: YYYY-DDD

예: '2024-366'은 2024년 12월 31일(윤년, 즉 366일)을 의미합니다.


ISO 8601 시간 형식

기본 시간 형식

표준 ISO 8601 시간 형식HH:MM:SS 또는 HH:MM:SS.sss입니다.

예:

  • 14:30:00 - 오후 2:30:00
  • 09:05:30 - 오전 9:05:30
  • 23:59:59.999 - 11:59:59.999 PM(밀리초)
// Java example
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

LocalTime time = LocalTime.of(14, 30, 0);
String isoTime = time.format(DateTimeFormatter.ISO_LOCAL_TIME);
System.out.println("ISO 8601 time: " + isoTime);  // "14:30:00"

분수 초

ISO 8601은 다양한 정밀도로 소수 초를 지원합니다.

  • 14:30:00.5 - 0.5초
  • 14:30:00.123 - 밀리초(3자리)
  • 14:30:00.123456 - 마이크로초(6자리)
  • 14:30:00.123456789 - 나노초(9자리)
// Go example
package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    // ISO 8601 with milliseconds
    iso := now.Format("15:04:05.000")
    fmt.Println("ISO 8601 time:", iso)
}

ISO 8601 날짜/시간 형식

결합된 날짜 및 시간

날짜와 시간을 모두 표시하기 위해 ISO 8601T 구분 기호(YYYY-MM-DDTHH:MM:SS`)를 사용합니다.

예:

  • 2024-04-15T14:30:00 - 2024년 4월 15일 오후 2시 30분(현지시간)
  • 2024-12-31T23:59:59 - 2024년 12월 31일 오후 11:59:59
# Ruby example
require 'time'

datetime = Time.new(2024, 4, 15, 14, 30, 0)
iso_datetime = datetime.iso8601  # "2024-04-15T14:30:00+00:00"
puts "ISO 8601 datetime: #{iso_datetime}"

"T" 구분 기호

T 문자는 날짜와 시간을 구분합니다. 표준 형식에서는 필수이지만 일부 시스템에서는 가독성을 위해 공백을 허용합니다.

// PHP example
<?php
$datetime = new DateTime('2024-04-15 14:30:00');
$iso8601 = $datetime->format('c');  // "2024-04-15T14:30:00+00:00"
echo "ISO 8601 datetime: " . $iso8601;
?>

ISO 8601 시간대 지정자

ISO 8601의 가장 강력한 기능 중 하나는 시간대 정보 지원입니다.

UTC 시간(Z 지정자)

Z 접미사는 UTC(협정 세계시)를 나타내며 "줄루 시간"이라고도 합니다.

  • 2024-04-15T14:30:00Z - 오후 2시 30분(UTC)

Z+00:00의 약어입니다.

// JavaScript example
const utcDate = new Date('2024-04-15T14:30:00Z');
console.log(utcDate.toISOString());  // "2024-04-15T14:30:00.000Z"

// Always prefer ISO 8601 with Z for UTC times
const timestamp = Date.now();
const isoString = new Date(timestamp).toISOString();
console.log(isoString);  // "2024-04-15T14:30:00.123Z"

시간대 오프셋

UTC가 아닌 시간의 경우 UTC로부터의 오프셋(±HH:MM)을 지정하세요.

예:

  • 2024-04-15T14:30:00+05:30 - 인도 오후 2:30(UTC+5:30)
  • 2024-04-15T14:30:00-04:00 - 동부 일광절약시간(UTC-4) 오후 2시 30분
  • 2024-04-15T14:30:00+00:00 - Z(UTC)와 동일
# Python example with timezone
from datetime import datetime, timezone, timedelta

# UTC time
utc_time = datetime(2024, 4, 15, 14, 30, 0, tzinfo=timezone.utc)
print(utc_time.isoformat())  # "2024-04-15T14:30:00+00:00"

# Custom timezone (UTC+5:30)
ist = timezone(timedelta(hours=5, minutes=30))
ist_time = datetime(2024, 4, 15, 14, 30, 0, tzinfo=ist)
print(ist_time.isoformat())  # "2024-04-15T14:30:00+05:30"

현지 시간(지정자 없음)

시간대를 지정하지 않으면 시간은 현지 시간으로 간주됩니다.

  • 2024-04-15T14:30:00 - 현지시간 기준 오후 2시 30분

경고: API 및 데이터베이스에서 현지 시간을 사용하지 마세요. 모호함을 방지하려면 항상 시간대를 지정하세요.


ISO 8601 기간 형식

ISO 8601은 접두사 'P'('기간')를 사용하여 기간에 대한 특정 표기법을 정의합니다.

기간 형식: P[n]Y[n]M[n]DT[n]H[n]M[n]S

  • P: 기간 지정자(필수)
  • Y: 연도 -M: 개월(T 이전) -D: 일
  • T: 시간 지정자(시간 구성 요소와 날짜를 구분함) -H: 시간
  • M: 분(T 이후) -S: 초

기간 예시

P3Y6M4DT12H30M5S  = 3 years, 6 months, 4 days, 12 hours, 30 minutes, 5 seconds
P1Y               = 1 year
P6M               = 6 months
P7D               = 7 days
PT2H30M           = 2 hours, 30 minutes
PT45S             = 45 seconds
P1DT12H           = 1 day, 12 hours
P0D               = 0 days (zero duration)
// JavaScript example (using date-fns or custom parsing)
function parseISO8601Duration(duration) {
    const regex = /P(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?/;
    const matches = duration.match(regex);

    return {
        years: parseInt(matches[1]) || 0,
        months: parseInt(matches[2]) || 0,
        days: parseInt(matches[3]) || 0,
        hours: parseInt(matches[4]) || 0,
        minutes: parseInt(matches[5]) || 0,
        seconds: parseInt(matches[6]) || 0
    };
}

const duration = parseISO8601Duration("P1DT2H30M");
console.log(duration);  // { years: 0, months: 0, days: 1, hours: 2, minutes: 30, seconds: 0 }

주 기간

W를 사용하여 기간을 주 단위로 표현할 수도 있습니다.

  • P3W = 3주(P21D와 동일)

ISO 8601 시간 간격

ISO 8601은 시간 간격을 표현하는 세 가지 방법을 지원합니다.

1. 시작 및 종료 시간

<시작>/<끝>

예: 2024-04-15T09:00:00Z/2024-04-15T17:00:00Z(오전 9시~오후 5시(UTC))

2. 시작 시간 및 기간

<시작>/P<기간>

예: 2024-04-15T09:00:00Z/PT8H(8시간 동안 오전 9시(UTC))

3. 기간 및 종료 시간

P<기간>/<끝>

예: PT8H/2024-04-15T17:00:00Z(UTC 오후 5시에 끝나는 8시간)

# Python example for intervals
from datetime import datetime, timedelta

start = datetime(2024, 4, 15, 9, 0, 0)
end = datetime(2024, 4, 15, 17, 0, 0)

# Calculate duration
duration = end - start
print(f"Duration: {duration}")  # 8:00:00

# ISO 8601 interval
interval = f"{start.isoformat()}/{end.isoformat()}"
print(f"Interval: {interval}")

ISO 8601 대 RFC 3339

RFC 3339는 인터넷에서 흔히 사용되는 ISO 8601의 프로파일입니다. 주요 차이점:

기능ISO 8601RFC 3339
형식YYYY-MM-DDTHH:MM:SS±HH:MM같은
UTCZ 또는 +00:00둘 다 허용됨
분수 초선택 사항, 모든 정밀도선택 사항, 모든 정밀도
구분 기호생략 가능(기본형식)필수(확장 형식)
시간 구분'T' 필수T 또는 공백 허용

예:

  • ISO 8601: 2024-04-15T14:30:00Z 또는 20240415T143000Z
  • RFC 3339: 2024-04-15T14:30:00Z(확장 형식만 해당)

대부분의 최신 API는 ISO 8601의 엄격한 하위 집합인 RFC 3339를 사용합니다.


개발자를 위한 ISO 8601 모범 사례

1. 저장 시 항상 UTC를 사용하세요.

'Z' 지정자를 사용하여 모든 타임스탬프를 UTC로 저장합니다.

// ✅ Good - Store in UTC
const timestamp = new Date().toISOString();  // "2024-04-15T14:30:00.123Z"

// ❌ Bad - Storing local time
const localTime = new Date().toString();  // "Mon Apr 15 2024 14:30:00 GMT+0500"

2. 시간대 정보 포함

시간을 표시할 때 항상 시간대 정보를 포함하세요.

# ✅ Good - Includes timezone
"2024-04-15T14:30:00+05:30"

# ❌ Bad - Missing timezone
"2024-04-15T14:30:00"

3. 확장 형식 사용

가독성을 위해 확장 형식(구분 기호 포함)을 선호합니다.

// ✅ Good - Extended format
"2024-04-15T14:30:00Z"

// ❌ Bad - Basic format (hard to read)
"20240415T143000Z"

4. 정확성이 중요합니다

사용 사례에 적합한 정밀도를 사용하세요.

// High precision for logging
"2024-04-15T14:30:00.123456789Z"

// Standard precision for most applications
"2024-04-15T14:30:00Z"

// Date only when time doesn't matter
"2024-04-15"

5. ISO 8601 문자열 유효성 검사

구문 분석하기 전에 항상 ISO 8601 문자열을 확인하세요.

// JavaScript validation
function isValidISO8601(dateString) {
    const iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})$/;
    if (!iso8601Regex.test(dateString)) return false;

    const date = new Date(dateString);
    return !isNaN(date.getTime());
}

console.log(isValidISO8601("2024-04-15T14:30:00Z"));  // true
console.log(isValidISO8601("2024-04-15 14:30:00"));   // false

피해야 할 일반적인 ISO 8601 실수

1. T 구분 기호 누락

// ❌ Wrong
"2024-04-15 14:30:00Z"

// ✅ Correct
"2024-04-15T14:30:00Z"

2. 잘못된 시간대 형식

# ❌ Wrong - Missing colon in offset
"2024-04-15T14:30:00+0530"

# ✅ Correct - Colon in offset
"2024-04-15T14:30:00+05:30"

3. 날짜 형식 혼합

// ❌ Wrong - US format
"04/15/2024T14:30:00Z"

// ✅ Correct - ISO 8601
"2024-04-15T14:30:00Z"

4. 선행 0 생략

# ❌ Wrong
"2024-4-5T9:5:0Z"

# ✅ Correct
"2024-04-05T09:05:00Z"

다양한 프로그래밍 언어의 ISO 8601

자바스크립트/타입스크립트

// Current time in ISO 8601
const now = new Date().toISOString();
console.log(now);  // "2024-04-15T14:30:00.123Z"

// Parse ISO 8601 string
const date = new Date("2024-04-15T14:30:00Z");

// Custom formatting (using Intl)
const formatter = new Intl.DateTimeFormat('en-US', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZone: 'UTC',
    hour12: false
});

파이썬

from datetime import datetime, timezone

# Current time in ISO 8601
now = datetime.now(timezone.utc).isoformat()
print(now)  # "2024-04-15T14:30:00.123456+00:00"

# Parse ISO 8601 string
dt = datetime.fromisoformat("2024-04-15T14:30:00+00:00")

# Format as ISO 8601
formatted = dt.strftime("%Y-%m-%dT%H:%M:%S%z")

자바

import java.time.Instant;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

// Current time in ISO 8601
String now = Instant.now().toString();
System.out.println(now);  // "2024-04-15T14:30:00.123Z"

// Parse ISO 8601 string
ZonedDateTime dt = ZonedDateTime.parse("2024-04-15T14:30:00Z");

// Format as ISO 8601
String formatted = dt.format(DateTimeFormatter.ISO_INSTANT);

PHP

<?php
// Current time in ISO 8601
$now = date('c');  // "2024-04-15T14:30:00+00:00"

// Parse ISO 8601 string
$dt = new DateTime("2024-04-15T14:30:00Z");

// Format as ISO 8601
echo $dt->format(DateTime::ATOM);  // ISO 8601 format
?>

가다

package main

import (
    "fmt"
    "time"
)

func main() {
    // Current time in ISO 8601
    now := time.Now().UTC().Format(time.RFC3339)
    fmt.Println(now)  // "2024-04-15T14:30:00Z"

    // Parse ISO 8601 string
    dt, _ := time.Parse(time.RFC3339, "2024-04-15T14:30:00Z")
    fmt.Println(dt)
}

루비

require 'time'

# Current time in ISO 8601
now = Time.now.utc.iso8601
puts now  # "2024-04-15T14:30:00Z"

# Parse ISO 8601 string
dt = Time.iso8601("2024-04-15T14:30:00Z")

# Format as ISO 8601
formatted = dt.strftime("%Y-%m-%dT%H:%M:%S%z")

ISO 8601 작업을 위한 도구

온라인 변환기

라이브러리 및 패키지

언어도서관설명
자바스크립트날짜-fns최신 날짜 유틸리티 라이브러리
자바스크립트dayjsmoment.js의 경량 대안
파이썬날짜시간내장된 표준 라이브러리
파이썬화살표더 나은 날짜와 시간
자바java.time최신 Java 날짜/시간 API
PHP'탄소'향상된 DateTime API
이동'시간'표준 라이브러리
루비'시간'표준 라이브러리

실제 사용 사례

1. API 응답

{
  "id": "123",
  "created_at": "2024-04-15T14:30:00Z",
  "updated_at": "2024-04-15T15:45:00Z",
  "scheduled_at": "2024-04-20T09:00:00Z"
}

2. 데이터베이스 저장

-- PostgreSQL with timezone
CREATE TABLE events (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    start_time TIMESTAMPTZ NOT NULL,  -- Stores in ISO 8601 with timezone
    end_time TIMESTAMPTZ NOT NULL
);

INSERT INTO events (name, start_time, end_time)
VALUES ('Meeting', '2024-04-15T14:30:00Z', '2024-04-15T15:30:00Z');

3. 로그 파일

[2024-04-15T14:30:00.123Z] INFO: Application started
[2024-04-15T14:30:01.456Z] DEBUG: Loading configuration
[2024-04-15T14:30:02.789Z] INFO: Server listening on port 3000

4. 구성 파일

# config.yml
scheduled_tasks:
  - name: "Daily backup"
    schedule: "2024-04-15T02:00:00Z"
    interval: "P1D"  # ISO 8601 duration: 1 day

  - name: "Weekly report"
    schedule: "2024-04-15T09:00:00Z"
    interval: "P1W"  # ISO 8601 duration: 1 week

자주 묻는 질문

ISO 8601의 "T"는 무엇을 의미하나요?

T는 날짜와 시간 구성 요소 사이의 구분 기호입니다. 이는 "시간"을 의미하며 모호함을 피하기 위해 ISO 8601 표준에서 요구됩니다.

ISO 8601은 RFC 3339와 동일합니까?

RFC 3339는 인터넷 사용을 위해 설계된 ISO 8601의 프로필(하위 집합)입니다. RFC 3339는 더 엄격하며 항상 구분 기호가 있는 확장 형식을 요구하는 반면, ISO 8601은 기본 형식과 확장 형식을 모두 허용합니다.

ISO 8601에서 YYYY-MM-DD 순서를 사용하는 이유는 무엇입니까?

이 순서(최대 단위에서 최소 단위)로 자연스러운 정렬이 가능합니다. ISO 8601 날짜를 알파벳순으로 정렬하면 자동으로 시간순으로 정렬됩니다.

"T" 대신 공백을 사용할 수 있나요?

일부 시스템에서는 가독성을 위해 공백을 허용하지만 ISO 8601 표준에서는 T 구분 기호가 필요합니다. 호환성을 최대화하려면 항상 'T'를 사용하세요.

타임스탬프를 저장하려면 어떤 시간대를 사용해야 하나요?

데이터베이스와 API에서는 항상 UTC('Z' 지정자 사용)로 타임스탬프를 저장하세요. 사용자에게 표시할 때만 현지 시간으로 변환합니다.

일광 절약 시간은 어떻게 처리하나요?

DST 문제를 방지하려면 항상 UTC로 저장하세요. 현지 시간으로 변환할 때 DST를 자동으로 처리하는 적절한 시간대 라이브러리를 사용하세요.

분수 초의 최대 정밀도는 얼마입니까?

ISO 8601은 최대 정밀도를 지정하지 않습니다. 대부분의 시스템은 밀리초(3자리), 마이크로초(6자리) 또는 나노초(9자리)를 지원합니다.

초가 0인 경우 초를 생략할 수 있나요?

일부 시스템에서는 2024-04-15T14:30Z를 허용하지만 엄격한 ISO 8601 형식에는 2024-04-15T14:30:00Z라는 초가 필요합니다.


관련 리소스


결론

ISO 8601은 소프트웨어 시스템에서 날짜와 시간을 나타내는 표준입니다. ISO 8601 형식을 따르면 타임스탬프가 명확하고 정렬 가능하며 전 세계 시스템과 호환되도록 할 수 있습니다.

주요 내용:

  • UTC 시간에는 YYYY-MM-DDTHH:MM:SSZ를 사용하세요.
  • 시간대 정보 포함(Z 또는 ±HH:MM)
  • UTC로 타임스탬프를 저장하고 현지 시간으로 표시합니다.
  • 구문 분석하기 전에 ISO 8601 문자열의 유효성을 검사합니다.
  • 가독성을 위해 확장 형식(구분 기호 포함)을 사용합니다.

ISO 8601 형식을 익히는 것은 날짜와 시간을 다루는 모든 개발자에게 필수적입니다. API를 구축하든, 데이터를 저장하든, 로그 파일을 구문 분석하든 ISO 8601은 시간 표현에 대한 안정적이고 표준화된 접근 방식을 제공합니다.

지금 바로 프로젝트에서 ISO 8601을 사용하여 날짜/시간 모호성을 영원히 없애십시오! 🚀