カテゴリ: C# 更新日: 2026/03/03

C#でタイムゾーンを扱う方法(TimeZoneInfoクラス)を徹底解説!初心者でもわかる時間変換の基本

C#でタイムゾーンを扱う方法(TimeZoneInfoクラス)
C#でタイムゾーンを扱う方法(TimeZoneInfoクラス)

先生と生徒の会話形式で理解しよう

生徒

「世界の時間って国ごとに違うって聞いたんですが、C#でもその違いを扱えるんですか?」

先生

「もちろんできますよ。C#にはTimeZoneInfoクラスという便利な仕組みがあって、タイムゾーンの変換や取得が簡単にできます。」

生徒

「タイムゾーンってそもそも何ですか?時計の種類みたいなものですか?」

先生

「良いところに気づきましたね。タイムゾーンは『地域ごとの時刻のルール』のことです。日本とアメリカでは時差があるので、その違いを管理する仕組みだと考えるとわかりやすいですよ。」

生徒

「なるほど…。その仕組みを使って時間を変換できるんですね?」

先生

「その通りです。それでは、TimeZoneInfoの基本から一緒に学んでいきましょう!」

1. TimeZoneInfoとは?

1. TimeZoneInfoとは?
1. TimeZoneInfoとは?

C#のTimeZoneInfoクラスは、異なる国や地域の時刻を扱うためのクラスです。 世界には日本時間(JST)、アメリカの太平洋標準時(PST)、協定世界時(UTC)など多くの時間の基準があります。 これらは地域ごとに異なるため、コンピューターが日時を正しく扱うには、タイムゾーンの情報が必要になります。

特にプログラミングでは、ログ管理・予約日時管理・オンラインサービス・世界対応アプリなどで「正しい時刻」が重要になります。 TimeZoneInfoを利用することで「どの地域の時間なのか」を明確に管理でき、時差の計算も自動で行ってくれます。

2. ローカル(現在のPC)のタイムゾーンを取得する

2. ローカル(現在のPC)のタイムゾーンを取得する
2. ローカル(現在のPC)のタイムゾーンを取得する

最初に、自分のコンピューターが設定しているタイムゾーンを取得してみましょう。 日本のPCなら通常「Tokyo Standard Time」が返ってきます。 以下のサンプルでは、PCの標準タイムゾーンを確認します。


var localZone = TimeZoneInfo.Local;
Console.WriteLine(localZone.DisplayName);

(例) (UTC+09:00) Osaka, Sapporo, Tokyo

このように、現在の環境がどの地域の時刻設定なのかを簡単に取得できます。 プログラミング初心者でも、まずはローカルタイムゾーンを確認するところから理解が深まります。

3. 特定の地域のタイムゾーンを取得する

3. 特定の地域のタイムゾーンを取得する
3. 特定の地域のタイムゾーンを取得する

世界の時刻を扱うには、他国のタイムゾーンを指定して取得する必要があります。 タイムゾーンには固有の識別子(ID)があり、IDを指定して取得します。

例えば、アメリカの太平洋標準時を取得するには次のように書きます。


var pstZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
Console.WriteLine(pstZone.DisplayName);

代表的なIDには以下のものがあります。

  • Tokyo Standard Time(日本)
  • Pacific Standard Time(アメリカ西海岸)
  • UTC(世界の基準時間)
  • China Standard Time(中国)

IDを指定するだけで必要な地域のタイムゾーンを使えるため、国際的なアプリを作るときに必須の知識になります。

4. 時刻を別のタイムゾーンに変換する方法

4. 時刻を別のタイムゾーンに変換する方法
4. 時刻を別のタイムゾーンに変換する方法

ある時刻を他の地域の時刻へ変換したい場合、TimeZoneInfo.ConvertTimeを使います。 これは日常の例でいうと「日本の時間をアメリカの時間に直す」作業です。


var now = DateTime.Now;
var pstZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");
var pstTime = TimeZoneInfo.ConvertTime(now, pstZone);

Console.WriteLine(pstTime);

ConvertTimeを使うことで、時差を自動的に計算してくれるため、自分で計算する必要はありません。 プログラミング初心者でも、安全かつ正確に時刻を扱えるようになります。

5. UTC(協定世界時)を利用したタイムゾーン管理

5. UTC(協定世界時)を利用したタイムゾーン管理
5. UTC(協定世界時)を利用したタイムゾーン管理

世界中のシステムで一般的に使われる時間の基準がUTC(協定世界時)です。 まずUTCで時刻を保存し、必要に応じて地域の時間に変換するという方法がよく使われます。


var utcNow = DateTime.UtcNow;
var tokyoZone = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time");
var tokyoTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, tokyoZone);

Console.WriteLine(tokyoTime);

この方法は「世界中のユーザーが使うアプリ」で特に重要です。 たとえば、国際的なゲーム・SNS・予約システムなどは、UTCを基準に時刻を管理します。

6. サマータイム(DST)にも自動で対応

6. サマータイム(DST)にも自動で対応
6. サマータイム(DST)にも自動で対応

一部の国では、夏の間だけ時刻を1時間早めるサマータイム(DST)が採用されています。 日本では使われていないため馴染みがないですが、アメリカやヨーロッパでは一般的です。

TimeZoneInfoは、このサマータイムの切り替えも自動で処理してくれるため、初心者でも安心して時間計算ができます。 手動で調整する必要がないのは、非常に便利なポイントです。

7. タイムゾーンの一覧を取得する

7. タイムゾーンの一覧を取得する
7. タイムゾーンの一覧を取得する

PCが対応している全てのタイムゾーンを確認したい場合は、次の方法が使えます。


foreach (var zone in TimeZoneInfo.GetSystemTimeZones())
{
    Console.WriteLine(zone.Id);
}

世界の国や地域のタイムゾーンを一覧で確認できるため、アプリの設定画面などで活用できます。

まとめ

まとめ
まとめ

ここまでC#におけるTimeZoneInfoクラスの活用方法について詳しく解説してきました。現代のアプリケーション開発において、時刻の管理は単なる「時計の表示」以上の意味を持ちます。特にクラウドサービスやグローバル展開を前提としたシステムでは、ユーザーが世界のどこにいても正しい時刻を提供しなければなりません。C#のTimeZoneInfoクラスは、そうした複雑な時差計算やサマータイム(Daylight Saving Time)の処理を一手に引き受けてくれる非常に強力なツールです。

TimeZoneInfoを使いこなすための重要ポイント

記事の内容を振り返り、実務で役立つ知識を整理しましょう。まず、タイムゾーン操作の基本は「基準」を決めることです。プログラミングの鉄則として、「内部データはUTC(協定世界時)で保持し、表示の際に各地域のタイムゾーンへ変換する」という設計指針が広く推奨されています。これにより、サーバーの場所やユーザーの居住地に依存しない一貫したデータ管理が可能になります。

  • TimeZoneInfo.Local:実行環境(PCやサーバー)の現在のタイムゾーンを取得します。
  • TimeZoneInfo.FindSystemTimeZoneById:特定の地域("Tokyo Standard Time"など)の情報をIDで取得します。
  • TimeZoneInfo.ConvertTime:異なるタイムゾーン間での時刻変換を行います。
  • サマータイムの自動補正:TimeZoneInfoクラスが内部的に歴史的なルールに基づき計算を行うため、開発者が手動で1時間を加減算する必要はありません。

実践的なサンプルプログラム:複数国の同時時刻表示

学んだ内容を応用して、複数の主要都市の現在時刻を一度に表示するプログラムを作成してみましょう。このコードでは、リスト化したタイムゾーンIDをループで処理し、それぞれの地域の現在時刻を動的に算出しています。


using System;
using System.Collections.Generic;

class WorldClock
{
    static void Main()
    {
        // 現在のUTC時刻を取得(これが変換のベースになる)
        DateTime utcNow = DateTime.UtcNow;
        Console.WriteLine($"[基準時刻] UTC: {utcNow:yyyy/MM/dd HH:mm:ss}");
        Console.WriteLine("------------------------------------------");

        // 表示したいタイムゾーンIDのリスト
        List<string> zoneIds = new List<string>
        {
            "Tokyo Standard Time",      // 日本
            "Pacific Standard Time",    // アメリカ西海岸(PST)
            "GMT Standard Time",        // イギリス(ロンドン)
            "Singapore Standard Time"   // シンガポール
        };

        foreach (string id in zoneIds)
        {
            try
            {
                // IDからタイムゾーン情報を取得
                TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(id);
                
                // UTCから指定したタイムゾーンの時刻に変換
                DateTime localTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, zone);
                
                // 結果の出力
                Console.WriteLine($"{zone.DisplayName,-30} : {localTime:yyyy/MM/dd HH:mm:ss}");
            }
            catch (TimeZoneNotFoundException)
            {
                Console.WriteLine($"エラー: タイムゾーン '{id}' が見つかりません。");
            }
        }
    }
}

上記のコードを実行すると、各国の標準時設定に基づいた時刻が一覧で表示されます。


[基準時刻] UTC: 2026/01/31 01:28:09
------------------------------------------
(UTC+09:00) Osaka, Sapporo, Tokyo : 2026/01/31 10:28:09
(UTC-08:00) Pacific Time (US & Canada) : 2026/01/30 17:28:09
(UTC+00:00) Dublin, Edinburgh, Lisbon, London : 2026/01/31 01:28:09
(UTC+08:00) Kuala Lumpur, Singapore : 2026/01/31 09:28:09

レガシーシステムとの連携(COBOLを想定)

歴史のあるシステム、例えば金融機関や基幹業務システムではCOBOLが今も現役で動いています。こうしたシステムとC#で作成した新しいシステムを連携させる際、日付や時刻のフォーマット、そして「どのタイムゾーンに基づいた数字か」という定義が非常に重要になります。COBOLではC#のような高度なタイムゾーンクラスを標準で持たない場合が多いため、C#側で「日本時間に変換済みの数値」を渡すなどの工夫が必要です。

参考までに、COBOLで現在の日時を取得する基本的な書き方を確認しておきましょう。


IDENTIFICATION DIVISION.
PROGRAM-ID. GET-TIME-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 CURRENT-DATE-FIELDS.
   05  CD-YEAR    PIC 9(4).
   05  CD-MONTH   PIC 9(2).
   05  CD-DAY     PIC 9(2).
   05  CD-HOUR    PIC 9(2).
   05  CD-MINUTE  PIC 9(2).
   05  CD-SECOND  PIC 9(2).

PROCEDURE DIVISION.
    * システムから現在の日時を取得(YYYYMMDDHHMMSS形式)
    MOVE FUNCTION CURRENT-DATE(1:14) TO CURRENT-DATE-FIELDS.
    
    DISPLAY "現在の日付: " CD-YEAR "/" CD-MONTH "/" CD-DAY.
    DISPLAY "現在の時刻: " CD-HOUR ":" CD-MINUTE ":" CD-SECOND.

    STOP RUN.

COBOL側ではマシンのシステム時刻をそのまま読み取ることが一般的です。そのため、クラウド環境などでサーバーの時刻がUTCになっている場合、C#側で適切にタイムゾーンを考慮してデータを受け渡ししないと、「DBに記録された時間と表示が9時間ズレている!」といったトラブルの原因になります。TimeZoneInfoクラスをマスターすることは、こうした事故を防ぐ「防波堤」を築くことでもあるのです。

初心者の方は、まずは「DateTime.UtcNowで取得し、TimeZoneInfo.ConvertTimeFromUtcで日本の時間にする」という一連の流れを暗記するくらい練習してみるのがおすすめです。慣れてきたら、世界地図を見ながら「この国はいま何時だろう?」とプログラムで試してみるのも面白いですよ。

先生と生徒の振り返り会話

生徒

「先生、TimeZoneInfoクラスって本当に便利ですね!今までは『時差があるから9時間を足す』みたいに手計算でコードを書いていたんですが、それだとサマータイムの時にバグっちゃいますよね…。」

先生

「その通り!手計算は一番危険な罠なんです。特にサマータイムは国によって開始日や終了日が毎年微妙に変わることもあるので、TimeZoneInfoのようなOSが持つ最新のルールセットに任せるのが正解なんですよ。」

生徒

「OSが最新のルールを知っているから、開発者はIDを指定するだけでいいんですね。あ、さっきのCOBOLの話も興味深かったです。昔のシステムと今のシステムを繋ぐときも、タイムゾーンの意識が欠かせないんですね。」

先生

「そうですね。古い言語やシステムでは『時間はどこでも共通』という前提で作られていることも多いです。C#を使って、そうした異なる環境間の橋渡しをするのもエンジニアの大切な仕事になります。」

生徒

「なんだか自分がグローバルなエンジニアに一歩近づいた気がします!まずはUTCを基準に考える習慣をつけてみます!」

先生

「素晴らしい意気込みです。UTCをベースにする設計思想(UTC-centric design)は、プロの現場でも非常に高く評価される視点ですよ。その調子で頑張りましょう!」

カテゴリの一覧へ
新着記事
New1
Azure
Azure SQL Databaseのリードスケールアウトとは?参照負荷分散でパフォーマンスを高速化する方法
New2
C#
C#プログラムの実行方法まとめ!Visual Studio・コマンドライン・.NET CLIの使い方
New3
C#
C#でHello Worldを表示する方法を完全ガイド!初心者でも1行から始められる入門講座
New4
COBOL
Micro Focus COBOLの特徴と使い方を徹底解説!初心者でもわかるIDE活用法
人気記事
No.1
Java&Spring記事人気No1
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.2
Java&Spring記事人気No2
C#
C#のプロパティとは?get/setアクセサの書き方と使い分け
No.3
Java&Spring記事人気No3
C#
C#のデリゲートとは?メソッドを変数のように扱う基本を解説
No.4
Java&Spring記事人気No4
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.5
Java&Spring記事人気No5
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.6
Java&Spring記事人気No6
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.7
Java&Spring記事人気No7
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.8
Java&Spring記事人気No8
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本