ロケールとタイムゾーン

画像

ロケールとタイムゾーンとは

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 TZ

TZが設定されていない場合、通常は/etc/localtimeの設定が使用されます。


tzselectコマンド

tzselectは、対話形式で地域を選択し、適切なタイムゾーン名を調べるコマンドです。

tzselect

大陸、国、地域などを順番に選択すると、最終的に次のようなタイムゾーン名が表示されます。

Asia/Tokyo

tzselectはタイムゾーン名を調べるためのコマンドです。実行しただけでは、/etc/localtimeなどのシステム設定は変更されません。

表示された結果は、たとえばTZ環境変数に設定できます。

export TZ=Asia/Tokyo

timedatectlコマンド

timedatectlは、systemdを採用したシステムで、時刻やタイムゾーンの設定を確認・変更するコマンドです。

現在の設定を確認する

timedatectl

または、次のように実行します。

timedatectl status

タイムゾーン、現在時刻、UTC、RTCなどの情報が表示されます。

タイムゾーンの一覧を表示する

timedatectl list-timezones

タイムゾーンを変更する

timedatectl set-timezone Asia/Tokyo

システム全体の設定を変更するため、通常は管理者権限が必要です。

sudo timedatectl set-timezone Asia/Tokyo

LinuCレベル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

ロケール

ロケールに関する環境変数

画像

ロケールは、主に次の環境変数で設定します。

  • LANG
  • LC_*
  • 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=C

LC_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=C

LC_ALLは一時的にすべてのカテゴリを統一したい場合に便利ですが、個別設定を上書きしてしまうため、恒久的な設定では注意が必要です。

設定を解除するには、次のようにします。

unset LC_ALL

Cロケールと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 -m

locale -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 -l

iconvはファイルの文字コードを変換するコマンドであり、ロケールそのものを変更するコマンドではありません。


試験対策の要点

以下の対応関係を押さえておきましょう。

項目内容
/usr/share/zoneinfo/タイムゾーン情報の保存場所
/etc/localtimeシステムで使用するタイムゾーン情報
/etc/timezoneタイムゾーン名を保存するファイル。主にDebian系
TZプロセス単位でタイムゾーンを指定
tzselect対話形式でタイムゾーン名を調べる
timedatectlsystemd環境で時刻・タイムゾーンを確認・変更
date日付・時刻を表示
LANGロケールのデフォルト値
LC_*カテゴリ別のロケール設定
LC_ALLすべてのロケール設定を上書き
locale現在のロケール設定を確認
locale -a利用可能なロケールを表示
locale -m利用可能な文字マップを表示
iconv文字エンコーディングを変換

特に重要な優先順位は次のとおりです。

LC_ALL > 対応するLC_* > LANG

また、次の違いも重要です。

  • tzselectはタイムゾーン名を調べるだけで、システム設定は変更しない
  • TZはプロセス単位のタイムゾーン設定
  • /etc/localtimeはシステム全体のタイムゾーン設定
  • ロケールの変更と、iconvによるファイルの文字コード変換は別の処理