Guide
タイムゾーンを理解する: タイムゾーンの完全ガイド
タイムゾーンとは何ですか?
タイムゾーン は、法的、商業的、社会的な目的で統一された標準時間を遵守する地球上の地域です。タイムゾーンは、世界標準時間として機能する 協定世界時 (UTC) からのオフセットによって定義されます。
たとえば:
- ニューヨークは UTC-5 (東部標準時) です。
- ロンドンはUTC+0 (グリニッジ標準時)です。
- 東京はUTC+9 (日本標準時)です。
- シドニーはUTC+10 (オーストラリア東部標準時)です。
タイムゾーンはなぜ存在するのでしょうか?
タイムゾーンが確立される前は、各都市は太陽の位置に基づいて独自の現地時間を保持していました。これにより、19 世紀の鉄道と電気通信に混乱が生じました。 1884 年、国際子午線会議 により、24 の標準タイムゾーンを含む現代のタイムゾーン システムが確立されました。
タイムゾーンの仕組み
基本
地球は 24 のタイムゾーンに分割されており、それぞれのタイムゾーンは約 15 度の経度を表します (360 度 ÷ 24 時間 = 1 時間あたり 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 | ニューヨーク |
| GMT (グリニッジ) | 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 時間遅れる)
- フォールバック: 時計は 1 時間進みます (1 時間進みます)。
世界中の夏時間
DST を実施している国:
- 米国 (ほとんどの州)
- カナダ (ほとんどの州)
- 欧州連合諸国
- オーストラリア(一部の州)
DST を実施していない国:
- 中国
- 日本
- インド
- アフリカの大部分
- 南アメリカの大部分
- アリゾナとハワイ (米国)
DST の合併症
DST は開発者にいくつかの課題をもたらします。
- タイムゾーン オフセットの変更: EST が EDT になります (UTC-5 → UTC-4)
- あいまいな時刻: 時計が戻ると、午前 1 時 30 分が 2 回発生します
- 失われた時間: 時計が進むとき、午前 2 時 30 分は存在しません
- 異なる移行日: 国によって 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」) を使用してください。
プログラミングにおけるタイムゾーンの処理
JavaScript / 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
?>
Java
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 移行中:
- 春の前進: 1 日は 23 時間です
- フォールバック: 1 日は 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();
タイムゾーンのリソースとツール
オンラインツール
- MakeTimestamp タイムゾーンコンバータ - タイムゾーン間の変換
- MakeTimestamp Meeting Planner - タイムゾーンをまたがるスケジュール
- Time.is - 任意のタイムゾーンの現在時刻
タイムゾーン データベース
- IANA タイム ゾーン データベース - タイムゾーン データの信頼できるソース
- tzdata - Unix/Linux タイムゾーン データベース
- Windows タイムゾーン データベース - Microsoft のタイムゾーン データ
図書館
JavaScript:
- Luxon - 最新の不変日付/時刻ライブラリ
- date-fns-tz - date-fns のタイムゾーンのサポート
- Moment タイムゾーン - Moment.js のタイムゾーン サポート (非推奨)
パイソン:
- pytz - ワールドタイムゾーンの定義
- dateutil - 日時に対する強力な拡張機能
- 矢印 - Python のより良い日付と時刻
Java:
- java.time - 組み込み(Java 8+)
- Joda-Time - 代替日付/時刻ライブラリ
よくある質問
なぜ中国は複数のタイムゾーンを使用しないのですか?
中国は 5 つの地理的タイムゾーンにまたがっているにもかかわらず、政治的統一のために単一のタイムゾーン (UTC+8) を使用しています。これは、日の出と日の入りの時間が国によって大幅に異なることを意味します。
国際日付変更線とは何ですか?
日付変更線は、太平洋のほぼ子午線 180 度に沿って走っています。東から西に横断すると 1 日追加されます。西から東に渡ると1日減ります。
タイムゾーンは変更できますか?
はい!国によっては、タイムゾーンや 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:00 → 午前 3:00)、午前 2:00 ~ 3:00 の間の時間は存在しません。ほとんどのシステムは次のことを行います。
- 午前 3:00 までスキップします
- エラーをスローする
- DST 前のオフセットを使用する
これを正しく処理するには、常にタイムゾーン ライブラリを使用してください。
概要
タイムゾーンは、世界中の時間を調整するために不可欠です。
重要なポイント:
- タイムゾーンは UTC (世界標準時間) からのオフセットです
- UTC と GMT: UTC の方が正確であり、最新の標準です。
- 夏時間により複雑さが増す - タイムゾーン ライブラリを使用する
- 時刻は常に UTC で保存され、ローカル タイムゾーンで表示されます
- IANA タイムゾーン識別子を使用します (例: 「America/New_York」)
- タイムゾーンの計算を手動で行わないでください - 適切なライブラリを使用してください
- DST 移行とエッジケースをテストする
タイムゾーンを使用する準備はできましたか? タイムゾーン コンバーター および ミーティング プランナー ツールをお試しください。