๐Ÿ•
โ† ๊ฐ€์ด๋“œ ๋ชฉ๋ก์œผ๋กœ

Unix ํƒ€์ž„์Šคํƒฌํ”„ ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜: ์‹ค์šฉ ๊ฐ€์ด๋“œ

ยท ํƒœ๊ทธ: timezone, dst, utc, time-conversion, unix-timestamp, daylight-saving, epoch

Unix ํƒ€์ž„์Šคํƒฌํ”„์— ์‹œ๊ฐ„๋Œ€๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ 

Unix ํƒ€์ž„์Šคํƒฌํ”„ ์ž์ฒด๋Š” ์‹œ๊ฐ„๋Œ€์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ์ˆซ์ž 1785292800์€ ์–ด๋””์—์„œ๋‚˜ ๋™์ผํ•œ ์ˆœ๊ฐ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žก์„ฑ์€ ๊ทธ ์ˆœ๊ฐ„์„ ํ‘œ์‹œ, ๋กœ๊น…, ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•ด ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์›์น™: ํ•ญ์ƒ UTC๋กœ ์ €์žฅํ•˜๊ณ , ํ‘œ์‹œ ๋ชฉ์ ์œผ๋กœ๋งŒ ๋ณ€ํ™˜ํ•˜์„ธ์š”. ์ด ๊ทœ์น™์€ ์ „์ฒด ๋ฒ”์ฃผ์˜ ๋ฒ„๊ทธ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ„๋Œ€ ๊ฐ„์— ์ด์‹ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

UTC vs ๋กœ์ปฌ ์‹œ๊ฐ„: ์ฐจ์ด์  ์ดํ•ดํ•˜๊ธฐ

UTC (ํ˜‘์ • ์„ธ๊ณ„์‹œ)

UTC๋Š” ์ฃผ์š” ์‹œ๊ฐ„ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ง€๊ตฌ์ƒ ์–ด๋””์—์„œ๋‚˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. Unix ํƒ€์ž„์Šคํƒฌํ”„๋Š” UTC๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์‹œ๊ฐ„

๋กœ์ปฌ ์‹œ๊ฐ„์€ ํŠน์ • ์ง€๋ฆฌ์  ์ง€์—ญ์— ๋งž๊ฒŒ ์กฐ์ •๋œ UTC์ž…๋‹ˆ๋‹ค. ๊ณ ์ • ์˜คํ”„์…‹(์˜ˆ: ์ค‘๊ตญ ํ‘œ์ค€์‹œ์˜ ๊ฒฝ์šฐ UTC+8)์ด๋‚˜ ๊ฐ€๋ณ€ ์˜คํ”„์…‹(์˜ˆ: ๋™๋ถ€ ํ‘œ์ค€์‹œ๋Š” DST์— ๋”ฐ๋ผ UTC-5์™€ UTC-4 ์‚ฌ์ด๋ฅผ ์ „ํ™˜)์œผ๋กœ UTC์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜คํ”„์…‹ ๋ฌธ์ œ

๋™์ผํ•œ Unix ํƒ€์ž„์Šคํƒฌํ”„๊ฐ€ ๊ด€์ฐฐ์ž์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋กœ์ปฌ ์‹œ๊ฐ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค:

| ํƒ€์ž„์Šคํƒฌํ”„ | UTC | ๋‰ด์š• (EST) | ๋„์ฟ„ (JST) | ๋Ÿฐ๋˜ (BST) | |-----------|-----|----------------|-------------|--------------| | 1785292800 | 2026-07-19 00:00 | 2026-07-18 20:00 | 2026-07-19 09:00 | 2026-07-19 01:00 | | 1785379200 | 2026-07-19 23:59 | 2026-07-19 19:59 | 2026-07-20 08:59 | 2026-07-20 00:59 |

์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„ (DST)

DST๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„(DST)์€ ์—ฌ๋ฆ„์ฒ  ์ €๋… ์ผ๊ด‘์ด ๋” ์˜ค๋ž˜ ์ง€์†๋˜๋„๋ก ์‹œ๊ณ„๋ฅผ ์•ž๋‹น๊ธฐ๋Š” ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค. ๋ด„์—๋Š” ์‹œ๊ณ„๊ฐ€ "์•ž์œผ๋กœ ์ด๋™"(1์‹œ๊ฐ„ ์†์‹ค)ํ•˜๊ณ  ๊ฐ€์„์—๋Š” "๋’ค๋กœ ์ด๋™"(1์‹œ๊ฐ„ ํš๋“)ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž„์Šคํƒฌํ”„ ๋ณ€ํ™˜์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

DST๋Š” ๋กœ์ปฌ ์‹œ๊ฐ„๊ณผ UTC ์‚ฌ์ด์— ๊ฐ€๋ณ€ ์˜คํ”„์…‹์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

  1. ๋™์ผํ•œ ๋กœ์ปฌ ์‹œ๊ฐ„์ด ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํƒ€์ž„์Šคํƒฌํ”„์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค("fall back" ์ „ํ™˜ ์‹œ, ์˜ค์ „ 1์‹œ๊ฐ€ ๋‘ ๋ฒˆ ๋ฐœ์ƒํ•จ)
  2. ์ผ๋ถ€ ๋กœ์ปฌ ์‹œ๊ฐ„์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค("spring forward" ์ „ํ™˜ ์‹œ, ์˜ˆ๋ฅผ ๋“ค์–ด ์˜ค์ „ 2์‹œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ์‹œ๊ณ„๊ฐ€ ๋ฐ”๋กœ ์˜ค์ „ 3์‹œ๋กœ ๋„˜์–ด๊ฐ)

์˜ˆ์ œ: ๋ชจํ˜ธํ•œ ์‹œ๊ฐ„

๋ฏธ๊ตญ ๋™๋ถ€ ์‹œ๊ฐ„๋Œ€์—์„œ๋Š” 11์›” ์ฒซ์งธ ์ผ์š”์ผ ์˜ค์ „ 2์‹œ์— ์‹œ๊ณ„๊ฐ€ ์˜ค์ „ 1์‹œ๋กœ ๋˜๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค:

from datetime import datetime, timezone
import pytz

eastern = pytz.timezone("America/New_York")

# ์˜ค์ „ 1์‹œ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐœ์ƒ (EDT, UTC-4)
first = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=True)
print(first.timestamp())
# Some timestamp value

# ์˜ค์ „ 1์‹œ์˜ ๋‘ ๋ฒˆ์งธ ๋ฐœ์ƒ (EST, UTC-5) = 3600์ดˆ ํ›„!
second = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=False)
print(second.timestamp())
# first.timestamp() + 3600

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจํ˜ธํ•œ "fall-back" ์‹œ๊ฐ„์„ ํ•ญ์ƒ ์ฃผ์˜ ๊นŠ๊ฒŒ ์ฒ˜๋ฆฌํ•˜์„ธ์š”. Python์—์„œ is_dst/ambiguous ํ”Œ๋ž˜๊ทธ๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๋™๋“ฑํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฏธ๋ฌ˜ํ•œ ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„๋Œ€ ๊ฐ„ ๋ณ€ํ™˜

์˜จ๋ผ์ธ ๋„๊ตฌ ์‚ฌ์šฉํ•˜๊ธฐ

์ผํšŒ์„ฑ ๋ณ€ํ™˜์„ ์œ„ํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์ €ํฌ Unix Timestamp Converter๋กœ, ์—ฌ๋Ÿฌ ์‹œ๊ฐ„๋Œ€์—์„œ ๊ฒฐ๊ณผ๋ฅผ ๋™์‹œ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

Linux ๋ช…๋ น์ค„ ์‚ฌ์šฉํ•˜๊ธฐ

# ์—ฌ๋Ÿฌ ์‹œ๊ฐ„๋Œ€์—์„œ ํƒ€์ž„์Šคํƒฌํ”„ ํ‘œ์‹œ
TZ="America/New_York" date -d @1785292800
TZ="Europe/London"    date -d @1785292800
TZ="Asia/Tokyo"       date -d @1785292800

# ์‚ฌ์šฉ์ž ์ง€์ • ISO ํ˜•์‹์œผ๋กœ
TZ="UTC" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Output: 2026-07-19 00:00:00 UTC

TZ="Asia/Shanghai" date -d @1785292800 +"%Y-%m-%d %H:%M:%S %Z"
# Output: 2026-07-19 08:00:00 CST

Python ์‚ฌ์šฉํ•˜๊ธฐ

from datetime import datetime
from zoneinfo import ZoneInfo  # Python 3.9+

ts = 1785292800

# ์—ฌ๋Ÿฌ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณ€ํ™˜
timezones = ["America/New_York", "Europe/London", "Asia/Tokyo", "Australia/Sydney"]

for tz_name in timezones:
    tz = ZoneInfo(tz_name)
    dt = datetime.fromtimestamp(ts, tz=tz)
    print(f"{tz_name}: {dt.strftime('%Y-%m-%d %H:%M:%S %Z')}")

JavaScript ์‚ฌ์šฉํ•˜๊ธฐ

const ts = 1785292800;
const date = new Date(ts * 1000);

const timezones = [
    "America/New_York",
    "Europe/London",
    "Asia/Tokyo",
    "Australia/Sydney"
];

for (const tz of timezones) {
    const str = date.toLocaleString("en-US", {
        timeZone: tz,
        timeZoneName: "short",
    });
    console.log(`${tz}: ${str}`);
}

Go ์‚ฌ์šฉํ•˜๊ธฐ

package main

import (
    "fmt"
    "time"
)

func main() {
    t := time.Unix(1785292800, 0)
    
    timezones := []string{
        "America/New_York",
        "Europe/London",
        "Asia/Tokyo",
        "Australia/Sydney",
    }
    
    for _, tz := range timezones {
        loc, _ := time.LoadLocation(tz)
        fmt.Printf("%s: %s\n", tz, t.In(loc).Format("2006-01-02 15:04:05"))
    }
}

์ผ๋ฐ˜์ ์ธ ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜ ํŒจํ„ด

์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ๋กœ์ปฌ ์‹œ๊ฐ„์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

์„œ๋ฒ„ ๋กœ๊ทธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ UTC๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ถ„์„ํ•  ๋•Œ ์ž์‹ ์˜ ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€๋กœ ๋ณ€ํ™˜ํ•˜์„ธ์š”:

# ๋กœ๊ทธ ํŒŒ์ผ์„ ์ฝ๊ณ  ํƒœํ‰์–‘ ์‹œ๊ฐ„์œผ๋กœ ํƒ€์ž„์Šคํƒฌํ”„ ํ‘œ์‹œ
while IFS= read -r line; do
    if [[ $line =~ ^([0-9]+) ]]; then
        ts="${BASH_REMATCH[1]}"
        TZ="America/Los_Angeles" date -d @"$ts" "+%Y-%m-%d %H:%M:%S"
        echo " $line"
    fi
done < server.log

๊ต์ฐจ ์‹œ๊ฐ„๋Œ€ ์ด๋ฒคํŠธ ์ผ์ • ์žก๊ธฐ

์‹œ๊ฐ„๋Œ€๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ์ด๋ฒคํŠธ ์‹œ๊ฐ„์„ ๊ณต์œ ํ•  ๋•Œ๋Š” ํ•ญ์ƒ UTC๋กœ ์†Œํ†ตํ•˜๊ฑฐ๋‚˜ Unix ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ์ง์ ‘ ๊ณต์œ ํ•˜์„ธ์š”. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ชจํ˜ธํ•จ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค:

  • "1785292800์— ํšŒ์˜"๋Š” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค
  • "์˜ค์ „ 9์‹œ EST์— ํšŒ์˜"๋Š” DST ์ „ํ™˜ ์‹œ ๋ชจํ˜ธํ•ด์ง‘๋‹ˆ๋‹ค
  • "์˜ค์ „ 9์‹œ America/New_York์— ํšŒ์˜"๋Š” ๋” ๋‚ซ์ง€๋งŒ ์—ฌ์ „ํžˆ DST ์ƒํƒœ๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํƒ€์ž„์Šคํƒฌํ”„ ์ €์žฅํ•˜๊ธฐ

-- ํ•ญ์ƒ ํƒ€์ž„์Šคํƒฌํ”„ ์ž์ฒด๋ฅผ ์ €์žฅํ•˜์„ธ์š” (์‹œ๊ฐ„๋Œ€ ๋…๋ฆฝ์ )
INSERT INTO events (occurred_at, user_id) VALUES (1785292800, 42);

-- ๋˜๋Š” ๋ช…์‹œ์ ์ธ UTC ํƒ€์ž„์Šคํƒฌํ”„ ์—ด๊ณผ ํ•จ๊ป˜ ์ €์žฅ
INSERT INTO events (occurred_at_utc, user_id) 
VALUES ('2026-07-19 00:00:00+00', 42);

๋ชจ๋ฒ” ์‚ฌ๋ก€ ์š”์•ฝ

  1. UTC๋กœ ์ €์žฅํ•˜๊ณ , ํ‘œ์‹œํ•  ๋•Œ ๋ณ€ํ™˜ํ•˜์„ธ์š” โ€” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋กœ์ปฌ ์‹œ๊ฐ„์„ ์ €์žฅํ•˜์ง€ ๋งˆ์„ธ์š”
  2. IANA ์‹œ๊ฐ„๋Œ€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์„ธ์š”(์˜ˆ: America/New_York). ์•ฝ์–ด(EST, PST)๋Š” ๋ชจํ˜ธํ•˜๊ณ  DST๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”ผํ•˜์„ธ์š”
  3. DST๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์„ธ์š” โ€” ์‹œ๊ฐ„๋Œ€ ์ธ์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ˆ˜๋™์œผ๋กœ ์‹œ๊ฐ„์„ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์ง€ ๋งˆ์„ธ์š”
  4. ํ•ญ์ƒ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š” โ€” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋‚ ์งœ๋ฅผ ๋ฐ›์„ ๋•Œ ์˜คํ”„์…‹๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์‹œ๊ฐ„๋Œ€๋„ ์ˆ˜์ง‘ํ•˜์„ธ์š”
  5. ๊ฒฝ๊ณ„ ๋‚ ์งœ๋ฅผ ํ…Œ์ŠคํŠธํ•˜์„ธ์š” โ€” DST ์ „ํ™˜ ๋‚ ์งœ(๋ด„๊ณผ ๊ฐ€์„ ๋ชจ๋‘)์—์„œ ๋ณ€ํ™˜ ๋กœ์ง์„ ํ…Œ์ŠคํŠธํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•˜์„ธ์š”

์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

์‹œ์Šคํ…œ์˜ ์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋Š” IANA ์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Olson ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ๊ณ ๋„ ํ•จ)์—์„œ ๊ฐ€์ ธ์˜ค๋ฉฐ, ์ •๋ถ€๊ฐ€ DST ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•จ์— ๋”ฐ๋ผ ์—ฐ๊ฐ„ ์—ฌ๋Ÿฌ ๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์„ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜์„ธ์š”:

# Debian / Ubuntu
sudo apt update && sudo apt install tzdata

# macOS
# ์†Œํ”„ํŠธ์›จ์–ด ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „ ํ™•์ธ
zdump -v /etc/localtime | head -1

๋ชจ๋“  ์ฃผ์š” ์‹œ๊ฐ„๋Œ€์— ๊ฑธ์ณ ๋น ๋ฅธ ์‹œ๊ฐ„๋Œ€ ์ธ์‹ ๋ณ€ํ™˜์„ ์œ„ํ•ด ์ €ํฌ Unix Timestamp Converter๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Unix ํƒ€์ž„์Šคํƒฌํ”„ ์‹œ๊ฐ„๋Œ€ ๋ณ€ํ™˜: ์‹ค์šฉ ๊ฐ€์ด๋“œ - CoolTool