Guide

시간대 이해: 시간대에 대한 전체 가이드

시간대란 무엇입니까?

시간대는 법적, 상업적, 사회적 목적을 위해 통일된 표준 시간을 준수하는 지구의 지역입니다. 시간대는 글로벌 시간 표준으로 사용되는 **협정 세계시(UTC)**와의 오프셋으로 정의됩니다.

예를 들면:

  • 뉴욕은 UTC-5(동부 표준시)를 따릅니다.
  • 런던은 UTC+0(그리니치 표준시)을 따릅니다.
  • 도쿄는 UTC+9(일본 표준시)를 따릅니다.
  • 시드니는 UTC+10(호주 동부 표준시)을 따릅니다.

시간대는 왜 존재하나요?

시간대가 설정되기 전에 각 도시는 태양의 위치를 ​​기준으로 자체 현지 시간을 유지했습니다. 이는 19세기 철도와 통신에 혼란을 가져왔습니다. 1884년에 국제 자오선 회의에서는 24개의 표준 시간대를 갖춘 현대 시간대 시스템을 확립했습니다.

시간대 작동 방식

기본 사항

지구는 24개 시간대로 나누어져 있으며 각 시간대는 대략 경도 15도(360° ¼ 24시간 = 시간당 15°)를 나타냅니다. 동쪽으로 이동하면 시간이 추가됩니다. 서쪽으로 이동하면 시간이 줄어듭니다.

UTC-12  UTC-11  UTC-10  ...  UTC+0  ...  UTC+10  UTC+11  UTC+12
   ←  West                    Prime Meridian        East  →

UTC: 보편적 표준

**협정 세계시(UTC)**는 세계에서 시계와 시간을 규제하는 기본 시간 표준입니다. 그것은:

  • 시간대의 영향을 받지 않음 - 어디에서나 항상 동일함
  • 일광 절약 시간의 영향을 받지 않음 - 변경되지 않음
  • 원자시계 기반 - 매우 정확함
  • 기준점 - 모든 시간대는 UTC를 기준으로 정의됩니다.

시간대 오프셋

시간대는 UTC의 오프셋으로 표현됩니다.

시간대오프셋예시 도시
HST (하와이)UTC-10호놀룰루
PST(태평양 표준시)UTC-8로스앤젤레스
MST(산)UTC-7덴버
CST(중부)UTC-6시카고
EST (동부)UTC-5뉴욕
그리니치 표준시(그리니치)UTC+0런던
CET(중앙 유럽)UTC+1파리
EET(동유럽)UTC+2아테네
MSK (모스크바)UTC+3모스크바
IST (인도)UTC+5:30뭄바이
CST(중국)UTC+8베이징
JST(일본)UTC+9도쿄
AEST(호주 동부)UTC+10시드니

참고: 일부 시간대에는 30분 또는 45분 오프셋이 있습니다(예: 인도는 UTC+5:30, 네팔은 UTC+5:45).

UTC와 GMT: 차이점은 무엇인가요?

GMT(그리니치 표준시)

  • 역사적 시간대는 런던 그리니치 왕립 천문대의 태양 위치를 기준으로 합니다.
  • 태양시 - 지구의 타원 궤도로 인해 약간 다를 수 있음
  • 시간대 지정 - 영국과 일부 아프리카 국가에서 주로 사용됩니다.

UTC(협정 세계시)

  • 원자 시계를 기반으로 한 현대 표준시
  • 매우 정확함 - 나노초 단위까지 정확함
  • 변경되지 않음 - 일광 절약 시간제의 영향을 받지 않음
  • 글로벌 표준 - 과학 및 기술 목적으로 전 세계적으로 사용됩니다.

주요 차이점

GMT: Based on Earth's rotation (solar time)
UTC: Based on atomic clocks (atomic time)

GMT: Can vary by up to 0.9 seconds
UTC: Precise to nanoseconds

GMT: Timezone (UTC+0)
UTC: Time standard (reference point)

실제: 대부분의 경우 GMT와 UTC는 동일하지만(둘 다 UTC+0) 기술 애플리케이션에서는 UTC가 선호되는 표준입니다.

일광 절약 시간(DST)

DST란 무엇인가요?

일광 절약 시간은 따뜻한 달에 시계를 앞당겨 더 늦은 시간에 어둠이 내리도록 하는 관행입니다. 일반적으로:

  • Spring Forward: 시계가 1시간 앞으로 이동합니다(1시간 손실).
  • Fall Back: 시계가 1시간 뒤로 이동합니다(1시간 증가).

전 세계 DST

DST를 준수하는 국가:

  • 미국(대부분의 주)
  • 캐나다(대부분의 주)
  • 유럽 연합 국가
  • 호주(일부 주)

DST를 준수하지 않는 국가:

  • 중국
  • 일본
  • 인도
  • 아프리카의 대부분
  • 남아메리카 대부분의 지역
  • 애리조나와 하와이(미국)

DST 합병증

DST는 개발자에게 몇 가지 과제를 안겨줍니다.

  1. 시간대 오프셋 변경: EST가 EDT가 됩니다(UTC-5 → UTC-4).
  2. 모호한 시간: 시계가 뒤로 떨어지면 오전 1시 30분이 두 번 발생합니다.
  3. 누락된 시간: 시계가 앞으로 나아갈 때 오전 2시 30분은 존재하지 않습니다.
  4. 다른 전환 날짜: 국가마다 다른 날짜에 DST를 변경합니다.

시간대 약어

일반적인 약어

북미:

  • PST/PDT: 태평양 표준시/일광 절약 시간(UTC-8/-7)
  • MST/MDT: 산지 표준시/일광 절약 시간(UTC-7/-6)
  • CST/CDT: 중부 표준시/일광절약시간(UTC-6/-5)
  • EST/EDT: 동부 표준시/일광 절약 시간(UTC-5/-4)

유럽:

  • GMT: 그리니치 표준시(UTC+0)
  • BST: 영국 서머타임(UTC+1)
  • CET/CEST: 중앙 유럽 표준시/서머타임(UTC+1/+2)
  • EET/EEST: 동부 유럽 시간/서머 타임(UTC+2/+3)

아시아:

  • IST: 인도 표준시(UTC+5:30)
  • CST: 중국 표준시(UTC+8)
  • JST: 일본 표준시(UTC+9)
  • KST: 한국 표준시(UTC+9)

호주:

  • AWST: 호주 서부 표준시(UTC+8)
  • ACST: 호주 중부 표준시(UTC+9:30)
  • AEST: 호주 동부 표준시(UTC+10)

모호한 약어

경고: 일부 약어는 모호합니다!

  • CST는 다음을 의미할 수 있습니다.

    • 중부 표준시(UTC-6) - 북미
    • 중국 표준시(UTC+8) - 아시아
    • 쿠바 표준시(UTC-5) - 카리브해
  • IST는 다음을 의미할 수 있습니다.

    • 인도 표준시(UTC+5:30)
    • 아일랜드 표준시(UTC+1)
    • 이스라엘 표준시(UTC+2)

모범 사례: 항상 전체 시간대 이름이나 IANA 시간대 식별자(예: America/New_York, Asia/Tokyo)를 사용하세요.

프로그래밍에서 시간대 처리

자바스크립트/Node.js

// Get current time in different timezones
const now = new Date();

// UTC time
console.log(now.toISOString()); // 2024-01-01T12:00:00.000Z

// Local time
console.log(now.toString()); // Mon Jan 01 2024 07:00:00 GMT-0500 (EST)

// Specific timezone (using Intl)
const nyTime = new Intl.DateTimeFormat('en-US', {
  timeZone: 'America/New_York',
  dateStyle: 'full',
  timeStyle: 'long'
}).format(now);
console.log(nyTime); // Monday, January 1, 2024 at 7:00:00 AM EST

// Using libraries (recommended)
// Luxon
import { DateTime } from 'luxon';

const dt = DateTime.now().setZone('America/New_York');
console.log(dt.toString()); // 2024-01-01T07:00:00.000-05:00

// Convert between timezones
const tokyo = dt.setZone('Asia/Tokyo');
console.log(tokyo.toString()); // 2024-01-01T21:00:00.000+09:00

파이썬

from datetime import datetime
import pytz

# UTC time
utc_now = datetime.now(pytz.UTC)
print(utc_now)  # 2024-01-01 12:00:00+00:00

# Specific timezone
ny_tz = pytz.timezone('America/New_York')
ny_time = utc_now.astimezone(ny_tz)
print(ny_time)  # 2024-01-01 07:00:00-05:00

# Convert between timezones
tokyo_tz = pytz.timezone('Asia/Tokyo')
tokyo_time = ny_time.astimezone(tokyo_tz)
print(tokyo_time)  # 2024-01-01 21:00:00+09:00

# Get timezone offset
offset = ny_tz.utcoffset(datetime.now())
print(offset)  # -1 day, 19:00:00 (equivalent to -5 hours)

PHP

<?php
// Set default timezone
date_default_timezone_set('UTC');

// Current time in UTC
$utc = new DateTime('now', new DateTimeZone('UTC'));
echo $utc->format('Y-m-d H:i:s P'); // 2024-01-01 12:00:00 +00:00

// Convert to different timezone
$ny = new DateTime('now', new DateTimeZone('America/New_York'));
echo $ny->format('Y-m-d H:i:s P'); // 2024-01-01 07:00:00 -05:00

// Convert existing datetime
$utc->setTimezone(new DateTimeZone('Asia/Tokyo'));
echo $utc->format('Y-m-d H:i:s P'); // 2024-01-01 21:00:00 +09:00
?>

자바

import java.time.*;
import java.time.format.DateTimeFormatter;

// UTC time
ZonedDateTime utc = ZonedDateTime.now(ZoneId.of("UTC"));
System.out.println(utc); // 2024-01-01T12:00:00Z[UTC]

// Specific timezone
ZonedDateTime ny = ZonedDateTime.now(ZoneId.of("America/New_York"));
System.out.println(ny); // 2024-01-01T07:00:00-05:00[America/New_York]

// Convert between timezones
ZonedDateTime tokyo = ny.withZoneSameInstant(ZoneId.of("Asia/Tokyo"));
System.out.println(tokyo); // 2024-01-01T21:00:00+09:00[Asia/Tokyo]

// Format with timezone
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
System.out.println(ny.format(formatter)); // 2024-01-01 07:00:00 EST

가다

package main

import (
    "fmt"
    "time"
)

func main() {
    // UTC time
    utc := time.Now().UTC()
    fmt.Println(utc) // 2024-01-01 12:00:00 +0000 UTC

    // Load timezone
    nyLoc, _ := time.LoadLocation("America/New_York")
    ny := time.Now().In(nyLoc)
    fmt.Println(ny) // 2024-01-01 07:00:00 -0500 EST

    // Convert between timezones
    tokyoLoc, _ := time.LoadLocation("Asia/Tokyo")
    tokyo := ny.In(tokyoLoc)
    fmt.Println(tokyo) // 2024-01-01 21:00:00 +0900 JST

    // Get timezone offset
    _, offset := ny.Zone()
    fmt.Printf("Offset: %d seconds\n", offset) // Offset: -18000 seconds (-5 hours)
}

시간대 처리 모범 사례

1. 항상 UTC로 시간을 저장하세요.

나쁜:

// Storing local time
const createdAt = "2024-01-01 14:30:00"; // What timezone?

좋은:

// Storing UTC timestamp
const createdAt = 1704117000; // Unix timestamp (always UTC)
// or
const createdAt = "2024-01-01T14:30:00Z"; // ISO 8601 with Z (UTC)

2. IANA 시간대 식별자 사용

나쁜:

const timezone = "EST"; // Ambiguous, doesn't handle DST

좋은:

const timezone = "America/New_York"; // Clear, handles DST automatically

3. 시간대 계산을 수동으로 수행하지 마세요.

나쁜:

// Manual offset calculation
const nyTime = utcTime + (5 * 3600); // Breaks during DST!

좋은:

// Use timezone libraries
const nyTime = DateTime.fromSeconds(utcTime).setZone('America/New_York');

4. 사용자의 현지 시간대로 시간 표시

// Store in UTC
const eventTime = "2024-06-15T18:00:00Z";

// Display in user's timezone
const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
const localTime = new Date(eventTime).toLocaleString('en-US', {
  timeZone: userTimezone,
  dateStyle: 'full',
  timeStyle: 'short'
});

5. 시간대를 명시적으로 명시하세요

나쁜:

// Ambiguous
const meeting = "Tomorrow at 3 PM";

좋은:

// Clear and unambiguous
const meeting = "Tomorrow at 3 PM EST (8 PM UTC)";
// or
const meeting = "2024-01-15T15:00:00-05:00"; // ISO 8601 with offset

6. 시간대 엣지 케이스 테스트

항상 테스트하세요:

  • DST 전환(스프링 포워드, 폴백)
  • 윤초(해당되는 경우)
  • 시간대 변경(국가마다 시간대가 때때로 변경됨)
  • 역사적 날짜(시간대 규칙은 시간에 따라 변경됨)

일반적인 시간대 문제

1. 하루가 24시간이라고 가정

DST 전환 중:

  • 봄 앞으로: 하루는 23시간입니다.
  • 폴백: 하루는 25시간입니다.

2. 시간대 오프셋 하드코딩

// Bad: Offset changes during DST
const offset = -5; // EST

// Good: Use timezone name
const timezone = 'America/New_York'; // Handles DST automatically

3. 날짜 구문 분석에서 시간대 무시

// Ambiguous - what timezone?
const date = new Date("2024-01-01 14:30:00");

// Clear - explicitly UTC
const date = new Date("2024-01-01T14:30:00Z");

4. 정규화하지 않고 날짜 비교하기

// Bad: Comparing dates in different timezones
const date1 = "2024-01-01T12:00:00-05:00"; // EST
const date2 = "2024-01-01T12:00:00+09:00"; // JST
// These are NOT the same time!

// Good: Convert to UTC first
const utc1 = new Date(date1).getTime();
const utc2 = new Date(date2).getTime();

시간대 리소스 및 도구

온라인 도구

시간대 데이터베이스

  • IANA 시간대 데이터베이스 - 시간대 데이터에 대한 권위 있는 소스
  • tzdata - Unix/Linux 시간대 데이터베이스
  • Windows 시간대 데이터베이스 - Microsoft의 시간대 데이터

라이브러리

자바스크립트:

  • Luxon - 불변의 최신 날짜/시간 라이브러리
  • date-fns-tz - date-fns에 대한 시간대 지원
  • 순간 시간대 - Moment.js에 대한 시간대 지원(더 이상 사용되지 않음)

파이썬:

  • pytz - 세계 시간대 정의
  • dateutil - datetime에 대한 강력한 확장
  • 화살표 - Python의 더 나은 날짜와 시간

자바:

  • java.time - 내장(Java 8+)
  • Joda-Time - 대체 날짜/시간 라이브러리

자주 묻는 질문

중국은 왜 여러 시간대를 사용하지 않나요?

5개의 지리적 시간대에 걸쳐 있음에도 불구하고 중국은 정치적 통합을 위해 단일 시간대(UTC+8)를 사용합니다. 이는 일출과 일몰 시간이 전국적으로 극적으로 다르다는 것을 의미합니다.

국제 날짜 변경선이란 무엇인가요?

국제 날짜 변경선은 대략 태평양의 180° 자오선을 따라 이어집니다. 동쪽에서 서쪽으로 건너면 하루가 추가됩니다. 서쪽에서 동쪽으로 건너면 하루가 뺍니다.

시간대를 변경할 수 있나요?

예! 국가에서는 때때로 시간대나 DST 규칙을 변경합니다. 예를 들면:

  • 러시아는 2014년에 대부분의 DST를 제거했습니다.
  • 터키는 2016년에 DST 관찰을 중단했습니다.
  • 북한은 2015년에 시간대를 변경했다(이후 2018년에 다시 변경).

데이터베이스에는 어떤 시간대를 사용해야 합니까?

항상 UTC를 사용하여 데이터베이스에 타임스탬프를 저장하세요. 사용자에게 표시할 때만 현지 시간대로 변환합니다.

여러 시간대에 걸쳐 '종일' 이벤트를 처리하려면 어떻게 해야 하나요?

시간대 정보 없이 하루 종일 이벤트를 날짜(타임스탬프 아님)로 저장합니다.

// All-day event
const birthday = "2024-01-15"; // Just the date, no time or timezone

봄 DST의 '잃어버린 시간'에는 무슨 일이 발생하나요?

시계가 앞으로 이동하는 경우(예: 오전 2시 → 오전 3시) 오전 2시~3시 사이의 시간은 존재하지 않습니다. 대부분의 시스템은 다음을 수행합니다.

  • 오전 3시로 건너뛰기
  • 오류를 던진다
  • DST 이전 오프셋을 사용합니다.

이를 올바르게 처리하려면 항상 시간대 라이브러리를 사용하십시오.

요약

시간대는 전 세계의 시간을 조정하는 데 필수적입니다.

주요 시사점:

  • 시간대는 UTC(세계 시간 표준)와의 오프셋입니다.
  • UTC vs GMT: UTC가 더 정확하고 현대적인 표준입니다.
  • 일광 절약 시간은 복잡성을 추가합니다. - 시간대 라이브러리를 사용합니다.
  • 항상 UTC로 시간을 저장하고 현지 시간대로 표시합니다.
  • IANA 시간대 식별자 사용(예: America/New_York)
  • 시간대 계산을 수동으로 수행하지 마십시오. 적절한 라이브러리를 사용하십시오.
  • DST 전환 및 엣지 케이스 테스트

시간대를 다룰 준비가 되셨나요? 시간대 변환기미팅 플래너 도구를 사용해 보세요!