🕐
← ガむド䞀芧に戻る

Unix タむムスタンプのタむムゟヌン倉換: 実践ガむド

· タグ: timezone, dst, utc, time-conversion, unix-timestamp, daylight-saving, epoch

タむムゟヌンが Unix タむムスタンプにずっお重芁な理由

Unix タむムスタンプ自䜓はタむムゟヌンに䟝存したせん — 数倀 1785292800 はどこでも同じ瞬間を意味したす。耇雑さが生じるのは、その瞬間を衚瀺、ログ蚘録、たたはデヌタ分析のために人間が読めるロヌカル時刻に倉換するずきです。

基本原則: 垞に UTC で保存し、衚瀺のためだけに倉換する。 このルヌルはバグのカテゎリ党䜓を排陀し、デヌタをタむムゟヌン間で移怍可胜にしたす。

UTC ずロヌカル時刻: 違いを理解する

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 ずは

倏時間は、倏の間に倜の明るい時間が長く続くように時蚈を進める慣行です。時蚈は春に「スプリングフォワヌド」1 時間倱うし、秋に「フォヌルバック」1 時間埗るしたす。

タむムスタンプ倉換ぞの圱響

DST は、ロヌカル時刻ず UTC の間に可倉オフセットを生み出したす。これは次のこずを意味したす:

  1. 同じロヌカル時刻が 2 ぀の異なるタむムスタンプに察応するこずがある「フォヌルバック」遷移䞭、午前 1:00 ずいう時刻が 2 回発生したす
  2. 存圚しないロヌカル時刻がある「スプリングフォワヌド」遷移䞭、たずえば午前 2:00 は決しお発生したせん — 時蚈は盎接午前 3:00 にゞャンプしたす

䟋: 曖昧な時刻

アメリカ合衆囜の東郚時間垯では、11 月の第 1 日曜日の午前 2:00 に、時蚈は午前 1:00 に戻りたす。これは次のこずを意味したす:

from datetime import datetime, timezone
import pytz

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

# First occurrence of 1:00 AM (EDT, UTC-4)
first = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=True)
print(first.timestamp())
# Some timestamp value

# Second occurrence of 1:00 AM (EST, UTC-5) = 3600 seconds later!
second = eastern.localize(datetime(2026, 11, 1, 1, 0), is_dst=False)
print(second.timestamp())
# first.timestamp() + 3600

アプリケヌションでは、曖昧なフォヌルバック時刻を垞に慎重に扱っおください。Python で is_dst/ambiguous フラグを䜿甚するか、他の蚀語で同等のオプションを䜿甚するず、埮劙なバグを防げたす。

タむムゟヌン間の倉換

圓瀟のオンラむンツヌルを䜿甚する

䞀床きりの倉換に最も簡単なアプロヌチは、耇数のタむムゟヌンで結果を同時に衚瀺する圓瀟の Unix タむムスタンプ倉換ツヌル です。

Linux コマンドラむンを䜿甚する

# Display timestamp in multiple timezones
TZ="America/New_York" date -d @1785292800
TZ="Europe/London"    date -d @1785292800
TZ="Asia/Tokyo"       date -d @1785292800

# With custom ISO format
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

# Convert to multiple timezones
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 で蚘録したす。分析するずきは、自分のロヌカルタむムゟヌンに倉換したす:

# Read a log file and display timestamps in Pacific time
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:00 EST に䌚議」は DST の移行䞭に曖昧になりたす
  • 「午前 9:00 America/New_York に䌚議」はより良いですが、それでも DST の状態を知る必芁がありたす

デヌタベヌスにタむムスタンプを保存する

-- Always store the timestamp itself (timezone-independent)
INSERT INTO events (occurred_at, user_id) VALUES (1785292800, 42);

-- OR store with an explicit UTC timestamp column
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 タむムゟヌンデヌタベヌスオル゜ンデヌタベヌスずも呌ばれたすから取埗されたす。これは、政府が DST ルヌルを倉曎するたびに幎に数回曎新されたす。システムを最新の状態に保ちたしょう:

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

# macOS
# Automatically updated via software updates

# Verify your database version
zdump -v /etc/localtime | head -1

䞻芁なすべおのタむムゟヌンにわたるすばやいタむムゟヌン察応の倉換には、圓瀟の Unix タむムスタンプ倉換ツヌル を䜿甚しおください。

Unix タむムスタンプのタむムゟヌン倉換: 実践ガむド - CoolTool