ロケールとタイムゾーン

ロケールとタイムゾーンとは
Linuxは、さまざまな言語や地域で利用できるように設計されています。そのため、地域に応じた表示や時刻を扱う仕組みとして、ロケールとタイムゾーンがあります。
- タイムゾーン
システムの時刻を、どの地域の現地時刻として表示するかを決めます。UTCとの時差や夏時間などが関係します。
- ロケール
メッセージの表示言語、日付・時刻、数値、通貨、文字の並び順など、言語や地域ごとの表示規則を決めます。
ロケールとタイムゾーンは独立しています。たとえば、タイムゾーンをAsia/Tokyoに設定したまま、メッセージを英語で表示することもできます。
タイムゾーン
タイムゾーンに関するファイル
/usr/share/zoneinfo/
/usr/share/zoneinfo/には、世界各地のタイムゾーン情報が保存されています。
タイムゾーンは、一般に「地域名/都市名」の形式で表されます。
Asia/Tokyo
America/New_York
Europe/Londonたとえば、東京のタイムゾーン情報は次のファイルに保存されています。
/usr/share/zoneinfo/Asia/Tokyo/etc/localtime
/etc/localtimeは、システムで使用するタイムゾーン情報を示すファイルです。
通常は、/usr/share/zoneinfo/以下にあるタイムゾーンファイルへのシンボリックリンク、またはそのファイルのコピーとして作成されます。
設定例は次のとおりです。
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtimeこの操作には管理者権限が必要です。
/etc/timezone
/etc/timezoneは、タイムゾーン名をテキストで保存するファイルです。主にDebian/Ubuntu系ディストリビューションで使用されます。
内容の例は次のとおりです。
Asia/Tokyoすべてのディストリビューションで使用されるとは限らない点に注意してください。
TZ環境変数
TZ環境変数を設定すると、システム全体のタイムゾーン設定を変更せずに、シェルやプロセス単位で使用するタイムゾーンを変更できます。
export TZ=Asia/Tokyo
dateコマンドの実行時だけ設定することもできます。
TZ=America/New_York dateこの場合、dateコマンドだけがニューヨークの現地時刻で表示されます。/etc/localtimeは変更されません。
実際にTimeZone指定が無い場合とある場合でdateコマンドを実行した結果が以下です。
root@miti-shirube:~# date
Thu Sep 3 10:56:35 JST 2026
root@miti-shirube:~# TZ=America/New_York date
Wed Sep 2 21:56:39 EDT 2026設定を解除するには、次のようにします。
unset TZTZが設定されていない場合、通常は/etc/localtimeの設定が使用されます。
tzselectコマンド
tzselectは、対話形式で地域を選択し、適切なタイムゾーン名を調べるコマンドです。
tzselect大陸、国、地域などを順番に選択すると、最終的に次のようなタイムゾーン名が表示されます。
Asia/Tokyotzselectはタイムゾーン名を調べるためのコマンドです。実行しただけでは、/etc/localtimeなどのシステム設定は変更されません。
表示された結果は、たとえばTZ環境変数に設定できます。
export TZ=Asia/Tokyotimedatectlコマンド
timedatectlは、systemdを採用したシステムで、時刻やタイムゾーンの設定を確認・変更するコマンドです。
現在の設定を確認する
timedatectlまたは、次のように実行します。
timedatectl statusタイムゾーン、現在時刻、UTC、RTCなどの情報が表示されます。
タイムゾーンの一覧を表示する
timedatectl list-timezonesタイムゾーンを変更する
timedatectl set-timezone Asia/Tokyoシステム全体の設定を変更するため、通常は管理者権限が必要です。
sudo timedatectl set-timezone Asia/TokyoLinuCレベル1では、timedatectlによるNTPサービスの詳細な制御やsystemd内部の動作まで覚える必要はありません。
dateコマンド
dateコマンドは、現在の日付と時刻を表示するコマンドです。
date表示される時刻は、TZ環境変数が設定されていればその値に、設定されていなければシステムのタイムゾーン設定に従います。
UTCで表示する
date -u表示形式を指定する
date '+%Y-%m-%d %H:%M:%S'主な書式指定子は次のとおりです。
| 書式 | 意味 |
|---|---|
%Y | 西暦年4桁 |
%m | 月 |
%d | 日 |
%H | 時 |
%M | 分 |
%S | 秒 |
%Z | タイムゾーンの略称 |
使用例は次のとおりです。
root@miti-shirube:~# TZ=Asia/Tokyo date
Thu Sep 3 10:50:16 JST 2026
root@miti-shirube:~# TZ=Asia/Tokyo date '+%Y-%m-%d %H:%M:%S %Z'
2026-09-03 10:50:17 JSTロケール
ロケールに関する環境変数

ロケールは、主に次の環境変数で設定します。
LANGLC_*LC_ALL
LANG
LANGは、ロケール全体のデフォルト値を指定する環境変数です。
export LANG=ja_JP.UTF-8カテゴリ別のLC_*が設定されていない場合、LANGの値が使用されます。
LC_*
LC_*は、ロケールをカテゴリごとに設定する環境変数です。
主な変数は次のとおりです。
| 環境変数 | 対象 |
|---|---|
LC_CTYPE | 文字の分類や大文字・小文字変換 |
LC_COLLATE | 文字列の並び順 |
LC_MESSAGES | メッセージの表示言語 |
LC_MONETARY | 通貨の表記 |
LC_NUMERIC | 数値や小数点の表記 |
LC_TIME | 日付や時刻の表記 |
たとえば、基本のロケールを日本語にし、日付・時刻の表記だけを米国英語にする場合は次のように設定します。
export LANG=ja_JP.UTF-8
export LC_TIME=en_US.UTF-8この場合、LC_TIMEはLANGより優先されます。
LC_ALL
LC_ALLは、すべてのロケールカテゴリを一括して上書きする環境変数です。
export LC_ALL=CLC_ALLが設定されている場合、個別のLC_*やLANGよりも優先されます。
優先順位は次のとおりです。
LC_ALL > 対応するLC_* > LANGたとえば、次の設定ではLC_ALLが優先されるため、LANGやLC_TIMEの値は使用されません。
export LANG=ja_JP.UTF-8
export LC_TIME=en_US.UTF-8
export LC_ALL=CLC_ALLは一時的にすべてのカテゴリを統一したい場合に便利ですが、個別設定を上書きしてしまうため、恒久的な設定では注意が必要です。
設定を解除するには、次のようにします。
unset LC_ALLCロケールとPOSIXロケール
Cは、特定の言語や地域に依存しない基本的なロケールです。POSIXも通常はCと同等に扱われます。
LANG=C dateコマンドの出力を一定の形式にしたいシェルスクリプトなどで利用されます。
localeコマンド
localeコマンドは、現在のロケール設定や、システムで利用可能なロケールを確認するコマンドです。
現在のロケール設定を表示する
locale実行例は次のとおりです。
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=利用可能なロケールを表示する
locale -a表示例は次のとおりです。
C
C.utf8
POSIX
en_US.utf8
ja_JP.utf8ロケール名の表記は、システムによってja_JP.UTF-8やja_JP.utf8などの違いがあります。実際に利用できる名前はlocale -aで確認します。
存在しないロケール名を環境変数に指定しても、そのロケールが新しく作成されるわけではありません。
利用可能な文字マップを表示する
locale -mlocale -mは、システムで利用できる文字マップの一覧を表示します。
localedefコマンド
localedefは、ロケール(言語や地域の表示規則)の定義ファイルからシステムが利用できるバイナリ形式のロケールデータを生成・追加するコマンドです。
localedef -i <定義ファイル> -f <文字コード> <ロケール名>日本語(UTF-8)のロケールデータを新規作成(コンパイル)
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8作成されたデータロケールデータの確認
作成されたデータは/usr/lib/locale/配下のアーカイブ等に書き込まれ、locale -aで確認可能です。
root@miti-shirube:~# locale -a
C
C.utf8
POSIX
ja_JP.utf8文字コードとiconvコマンド
主な文字コード
ロケールと関連して、代表的な文字コードについても押さえておきます。
ASCII
英数字や基本的な記号などを表す文字コードです。日本語などは扱えません。
ISO-8859
主に欧米の言語で使用されてきた文字コード群です。ISO-8859-1など、複数の種類があります。
Unicode
世界中の文字を共通の体系で扱うための文字集合です。
UTF-8
Unicodeの符号化方式の一つです。ASCIIとの互換性があり、現在のLinuxでは広く利用されています。
iconvコマンド
iconvは、テキストの文字エンコーディングを変換するコマンドです。
基本書式は次のとおりです。
iconv -f 変換元文字コード -t 変換先文字コード 入力ファイルたとえば、Shift_JISのファイルをUTF-8へ変換する場合は、次のように実行します。
iconv -f SHIFT_JIS -t UTF-8 input.txt > output.txt主なオプションは次のとおりです。
| オプション | 意味 |
|---|---|
-f | 変換元の文字コード |
-t | 変換先の文字コード |
-l | 利用可能な文字コードの一覧表示 |
iconv -liconvはファイルの文字コードを変換するコマンドであり、ロケールそのものを変更するコマンドではありません。
試験対策の要点
以下の対応関係を押さえておきましょう。
| 項目 | 内容 |
|---|---|
/usr/share/zoneinfo/ | タイムゾーン情報の保存場所 |
/etc/localtime | システムで使用するタイムゾーン情報 |
/etc/timezone | タイムゾーン名を保存するファイル。主にDebian系 |
TZ | プロセス単位でタイムゾーンを指定 |
tzselect | 対話形式でタイムゾーン名を調べる |
timedatectl | systemd環境で時刻・タイムゾーンを確認・変更 |
date | 日付・時刻を表示 |
LANG | ロケールのデフォルト値 |
LC_* | カテゴリ別のロケール設定 |
LC_ALL | すべてのロケール設定を上書き |
locale | 現在のロケール設定を確認 |
locale -a | 利用可能なロケールを表示 |
locale -m | 利用可能な文字マップを表示 |
iconv | 文字エンコーディングを変換 |
特に重要な優先順位は次のとおりです。
LC_ALL > 対応するLC_* > LANGまた、次の違いも重要です。
tzselectはタイムゾーン名を調べるだけで、システム設定は変更しないTZはプロセス単位のタイムゾーン設定/etc/localtimeはシステム全体のタイムゾーン設定- ロケールの変更と、
iconvによるファイルの文字コード変換は別の処理