Unix ํ์์คํฌํ ์๊ฐ๋ ๋ณํ: ์ค์ฉ ๊ฐ์ด๋
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 ์ฌ์ด์ ๊ฐ๋ณ ์คํ์ ์ ์์ฑํฉ๋๋ค. ์ด๋ ๋ค์์ ์๋ฏธํฉ๋๋ค:
- ๋์ผํ ๋ก์ปฌ ์๊ฐ์ด ๋ ๊ฐ์ ๋ค๋ฅธ ํ์์คํฌํ์ ๋์ํ ์ ์์ต๋๋ค("fall back" ์ ํ ์, ์ค์ 1์๊ฐ ๋ ๋ฒ ๋ฐ์ํจ)
- ์ผ๋ถ ๋ก์ปฌ ์๊ฐ์ ์กด์ฌํ์ง ์์ต๋๋ค("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);
๋ชจ๋ฒ ์ฌ๋ก ์์ฝ
- UTC๋ก ์ ์ฅํ๊ณ , ํ์ํ ๋ ๋ณํํ์ธ์ โ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ก์ปฌ ์๊ฐ์ ์ ์ฅํ์ง ๋ง์ธ์
- IANA ์๊ฐ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์(์:
America/New_York). ์ฝ์ด(EST, PST)๋ ๋ชจํธํ๊ณ DST๋ฅผ ๊ณ ๋ คํ์ง ์์ผ๋ฏ๋ก ํผํ์ธ์ - DST๋ฅผ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌํ์ธ์ โ ์๊ฐ๋ ์ธ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ์๋์ผ๋ก ์๊ฐ์ ๋ํ๊ฑฐ๋ ๋นผ์ง ๋ง์ธ์
- ํญ์ ์๊ฐ๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ธ์ โ ์ฌ์ฉ์๋ก๋ถํฐ ๋ ์ง๋ฅผ ๋ฐ์ ๋ ์คํ์ ๋ฟ๋ง ์๋๋ผ ์๊ฐ๋๋ ์์งํ์ธ์
- ๊ฒฝ๊ณ ๋ ์ง๋ฅผ ํ ์คํธํ์ธ์ โ DST ์ ํ ๋ ์ง(๋ด๊ณผ ๊ฐ์ ๋ชจ๋)์์ ๋ณํ ๋ก์ง์ ํ ์คํธํ์ฌ ๋ฒ๊ทธ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํ์ธ์
์๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค
์์คํ ์ ์๊ฐ๋ ๋ฐ์ดํฐ๋ IANA ์๊ฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค(Olson ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๊ณ ๋ ํจ)์์ ๊ฐ์ ธ์ค๋ฉฐ, ์ ๋ถ๊ฐ DST ๊ท์น์ ๋ณ๊ฒฝํจ์ ๋ฐ๋ผ ์ฐ๊ฐ ์ฌ๋ฌ ๋ฒ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์์คํ ์ ์ต์ ์ํ๋ก ์ ์งํ์ธ์:
# Debian / Ubuntu
sudo apt update && sudo apt install tzdata
# macOS
# ์ํํธ์จ์ด ์
๋ฐ์ดํธ๋ฅผ ํตํด ์๋์ผ๋ก ์
๋ฐ์ดํธ๋จ
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฒ์ ํ์ธ
zdump -v /etc/localtime | head -1
๋ชจ๋ ์ฃผ์ ์๊ฐ๋์ ๊ฑธ์ณ ๋น ๋ฅธ ์๊ฐ๋ ์ธ์ ๋ณํ์ ์ํด ์ ํฌ Unix Timestamp Converter๋ฅผ ์ฌ์ฉํ์ธ์.