学习 Linux 101:本地化和国际化

概述

在本教程中,将学习如何:

  • 配置语言环境和环境变量
  • 配置时区和环境变量

时间、地点和语言

全球有成千上万种不同的语言。数字和日期的格式也各不相同,并且存在 40 多个字母表或表意文字集。可以使用 12 小时制或 24 小时制进行计时。也存在各种各样的测量系统,可以测量从建筑材料到用于书写或印刷的纸张的一切事物。本教程将展示如何配置 Linux 系统以使其适应您的语言环境,以便以上变量以您习惯的方式显示。

由于一天有 24 小时,您的时区可能与我的时区有所不同,因此我还会展示如何配置时区设置和相关环境变量。

本教程将帮助您为 Linux Server Professional (LPIC-1) 考试 102 的主题 107 中的目标 107.3 做好应考准备。该目标的权重为 3。

前提条件

要想最充分地利用本系列教程,您应该掌握 Linux 的基本知识,还应该有一个正常工作的 Linux 系统,您可以在这个系统上练习本教程中涵盖的命令。您应熟悉 GNU 和 UNIX 命令。有时候,程序的不同版本将输出不同的格式,所以您的结果可能并不总是与这里显示的列表完全相同。

除非另有说明,否则我将对本教程中的示例使用运行 Wayland 的 Fedora 25 和运行 X11 的 Ubuntu 16.04 LTS。

本地化和国际化

使系统符合特定语言环境的需求这一过程称为本地化,本地化通常可以缩写为 l18n,其中数字 18 代表开头的 l 和结尾的 n 之间的 18 个内部字母。要使系统适应您的语言环境,系统必须具备这种适应能力。编写软件以使其可以适应不同语言环境这一过程称为国际化,同样,国际化可以缩写为 i18n

语言环境设置和环境变量

在安装 Linux 系统时,可以针对使用它的国家或地区设置语言和相应的键盘。您可以使用 localectl 命令来显示语言和键盘设置;如果只想查看系统语言,那么可以显示 LANG 环境变量的值。 清单 1 展示了我的 Fedora 25 系统上的这些命令。注意:如果单独使用 localectl,那么默认为显示状态。

清单 1. 显示系统设置

[ian@atticf25 ~]$ localectl status
   System Locale: LANG=en_US.UTF‑8
       VC Keymap: us
      X11 Layout: us
[ian@atticf25 ~]$ echo $LANG
en_US.UTF‑8

您可以看到我使用的是美国键盘,而我的语言已设置为 enUS.UTF-8。LANG 设置通常为一个两小写字母的语言代码,后跟一个下划线 () 和一个两大写字母的国家或地区代码,再后跟一个句点和代码页或字符集名称(在此示例中为 UTF-8)。如果某种语言没有相应的两字母 ISO 639-1 代码,那么将改用三字母 ISO 639-2 代码。例如,fur_IT 将用于意大利弗留利区的弗留利语。根据上下文,某些部分可能不区分大小写,如我的一些示例所示。

您可以使用带有 -a(或 --all-locales)选项的 locale 命令,以显示系统上所有可用语言环境的列表。在 Fedora 系统上,该列表比较长,因此清单 2 仅显示了该列表的部分内容。在我的 Ubuntu 15.04 LTS 系统上,该列表仅限于英语语言环境,因为我在安装系统时选择了英语。

清单 2. 列出可用语言环境

[ian@atticf25 ~]$ #Display all French locales
[ian@atticf25 ~]$ locale ‑‑all‑locales | grep fr_
fr_BE
fr_BE@euro
fr_BE.iso88591
fr_BE.iso885915@euro
fr_BE.utf8
fr_CA
fr_CA.iso88591
fr_CA.utf8
fr_CH
fr_CH.iso88591
fr_CH.utf8
fr_FR@euro
fr_FR.iso88591
fr_FR.iso885915@euro
fr_FR.utf8
fr_LU
fr_LU@euro
fr_LU.iso88591
fr_LU.iso885915@euro
fr_LU.utf8
[ian@atticf25 ~]$ #Display all Friulian locales
[ian@atticf25 ~]$ locale ‑‑all‑locales |grep "^fur"
fur_IT
fur_IT.utf8
[ian@atticf25 ~]$ #How many locales are on this system?
[ian@atticf25 ~]$ locale ‑a | wc ‑l
823

语言环境类别

我前面还提到了一些其他设置,例如数字格式或货币符号,这些设置会因语言环境而异。它们可分为几类。使用 locale 命令可查看当前设置,如清单 3 所示。

清单 3. 查看语言环境设置

[ian@atticf25 ~]$ locale
LANG=en_US.UTF‑8
LC_CTYPE="en_US.UTF‑8"
LC_NUMERIC="en_US.UTF‑8"
LC_TIME="en_US.UTF‑8"
LC_COLLATE="en_US.UTF‑8"
LC_MONETARY="en_US.UTF‑8"
LC_MESSAGES="en_US.UTF‑8"
LC_PAPER="en_US.UTF‑8"
LC_NAME="en_US.UTF‑8"
LC_ADDRESS="en_US.UTF‑8"
LC_TELEPHONE="en_US.UTF‑8"
LC_MEASUREMENT="en_US.UTF‑8"
LC_IDENTIFICATION="en_US.UTF‑8"
LC_ALL=

这些设置通常统称为 LC_*。它们不是实际的环境变量,因为可以使用 echo 命令来查看这些设置。但是,您可以为这些设置分配值。

值 LC_CTYPE、LC_COLLATE、LC_MESSAGES、LC_MONETARY、LC_NUMERIC 和 LC_TIME 都由 POSIX 进行定义。GNU C 库还支持 LC_IDENTIFICATION、LC_MEASUREMENT、LC_NAME、LC_PAPER 和 LC_TELEPHONE。注意:这些额外值并非在所有 UNIX 版本上都可用。

每个类别都包含一个或多个关键字。将 locale 命令与一个或多个类别或关键字名称结合使用,以显示有关该类别或关键字的信息,如清单 4 所示。

清单 4. 显示有关类别和关键字的信息

[ian@atticf25 ~]$ locale LC_NUMERIC
.
,
3;3
46
44
UTF‑8
[ian@atticf25 ~]$ locale thousands_sep decimal_point
,
.

清单 4 中的输出显示并没有什么特别的作用,但在您需要单个关键字的值时除外。添加 -c(或 --category-name)选项可显示类别名称,或者添加 -k(或 --keyword-name)可显示关键字名称。您可以同时使用这两个关键字,这样做通常很有用,特别是在显示多个类别时。清单 5 展示了这些选项的一些示例。

清单 5. 使用 locale 的 -c 和 -k 选项

[ian@atticf25 ~]$ locale ‑‑category‑name ‑‑keyword‑name LC_NUMERIC LC_PAPER
LC_NUMERIC
decimal_point="."
thousands_sep=","
grouping=3;3
numeric‑decimal‑point‑wc=46
numeric‑thousands‑sep‑wc=44
numeric‑codeset="UTF‑8"
LC_PAPER
height=279
width=216
paper‑codeset="UTF‑8"
[ian@atticf25 ~]$ locale ‑ck thousands_sep decimal_point height
LC_NUMERIC
thousands_sep=","
LC_NUMERIC
decimal_point="."
LC_PAPER
height=279

您可以通过更改 LANG 的值来更改语言环境设置;例如,LANG=en_GB.UTF8 将我所有的 US ENGLISH 语言环境设置都更改为 British English。这将更改所有的 LC_* 设置。清单 6 展示了我的 Ubuntu 16.04 LTS 系统上的一个示例。与普通环境变量的赋值不同,对 LANG 的更改将由子进程继承,而且无需将其导出。

注意:基于 Debian 的系统(包括 Ubuntu)都有一个附加的 LANGUAGE 值,当您更改 LANG 值时,该附加值不会发生更改。LANGUAGE 通常与系统语言相同,但是可以将其设置为可用于消息的语言冒号分隔列表。如果不提供特定语言的消息,这样做可以提供一个后备机制。

清单 6. Ubuntu 上的 LAMG 和 LANGUAGE 设置

ian@attic‑u16:~$ LANG=en_GB.UTF8
ian@attic‑u16:~$ locale
LANG=en_GB.UTF8
LANGUAGE=en_US
LC_CTYPE="en_GB.UTF8"
LC_NUMERIC="en_GB.UTF8"
LC_TIME="en_GB.UTF8"
LC_COLLATE="en_GB.UTF8"
LC_MONETARY="en_GB.UTF8"
LC_MESSAGES="en_GB.UTF8"
LC_PAPER="en_GB.UTF8"
LC_NAME="en_GB.UTF8"
LC_ADDRESS="en_GB.UTF8"
LC_TELEPHONE="en_GB.UTF8"
LC_MEASUREMENT="en_GB.UTF8"
LC_IDENTIFICATION="en_GB.UTF8"
LC_ALL=

有时候,您可能想要在不更改系统语言或语言环境设置的情况下更改所有的 LC* 类别。通常可以在脚本中完成此操作,但是您可以针对单个命令覆盖环境。可以设置 LC_ALL 以一次性更改所有的 Lc*c 类别,也可以单独设置一个或多个类别(如 LC_MONETARY)。清单 7 展示了我的 Ubuntu 16.04 LTS 系统上的一些示例。

清单 7. 覆盖语言环境设置

ian@attic‑u16:~$ locale ‑ck int_curr_symbol currency_symbol
LC_MONETARY
int_curr_symbol="USD "
LC_MONETARY
currency_symbol="$"
ian@attic‑u16:~$ LC_ALL=en_GB.UTF8 locale ‑ck int_curr_symbol currency_symbol
LC_MONETARY
int_curr_symbol="GBP "
LC_MONETARY
currency_symbol="£"
ian@attic‑u16:~$ LC_MONETARY=en_ZA.UTF8 locale ‑ck int_curr_symbol currency_symbol
LC_MONETARY
int_curr_symbol="ZAR "
LC_MONETARY
currency_symbol="R"

C 语言环境

C(或 POSIX)语言环境提供了可供程序和 shell 脚本经常使用的基本语言环境,这是 C 程序的默认语言环境。凭借此语言环境,程序或脚本可以使用一个公认的环境,而不必考虑本地化的问题,因为根本不需要进行本地化。脚本和程序都可以根据需要设置其他语言环境。

其他语言支持

大多数系统在最初安装时都只支持一种语言。在将软件包添加到系统时,这些软件包可以根据系统语言设置来添加特定于语言的组件。对于您尝试执行的某种操作,如果缺少相应的语言支持,那么您可能会看到一条错误消息,并且可能使用系统的语言显示所有输出内容。清单 8 展示了如何使用英语和法语列出星期名称及其缩写。

清单 8. 列出星期名称

ian@attic‑u16:~$ locale ‑ck day abday
LC_TIME
day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday"
LC_TIME
abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"
ian@attic‑u16:~$ LC_ALL=fr_FR.UTF8 locale ‑ck day abday
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LC_TIME
day="Sunday;Monday;Tuesday;Wednesday;Thursday;Friday;Saturday"
LC_TIME
abday="Sun;Mon;Tue;Wed;Thu;Fri;Sat"

糟糕!如您所见,此系统似乎没有安装法语支持。现在,我将展示如何在 Ubuntu 和 Fedora 系统上安装其他语言支持。

Ubuntu 有一个 check-language-support 程序,可用于查找特定语言需要哪些软件包。如果不使用任何自变量,它将识别您的系统上缺省的语言支持。清单 9 展示了一些示例。

清单 9. 查找 Ubuntu 上缺少的语言包

ian@attic‑u16:~$ check‑language‑support
gimp‑help‑en hunspell‑en‑au hunspell‑en‑ca hyphen‑en‑gb libreoffice‑help‑en‑gb 
libreoffice‑l10n‑en‑gb libreoffice‑l10n‑en‑za mythes‑en‑au thunderbird‑locale‑en‑gb
ian@attic‑u16:~$ check‑language‑support ‑l en_US
gimp‑help‑en
ian@attic‑u16:~$ check‑language‑support ‑l fr
firefox‑locale‑fr gimp‑help‑fr hunspell‑fr hyphen‑fr language‑pack‑fr language‑pack‑gnome‑fr 
libreoffice‑help‑fr libreoffice‑l10n‑fr mythes‑fr thunderbird‑locale‑fr wfrench

您可以将 check-language-support 的输出用作 apt-get 的输入,以便安装所需的软件包。清单 10 展示了如何安装所需的法语软件包。

清单 10. 使用 apt-get 安装法语语言支持

ian@attic‑u16:~$ sudo apt‑get install $(check‑language‑support ‑l fr)
Reading package lists...Done
Building dependency tree       
Reading state information...Done
The following additional packages will be installed:
  gimp‑help‑common hunspell‑fr‑classical language‑pack‑fr‑base
  language‑pack‑gnome‑fr‑base
Suggested packages:
  hunspell libreoffice‑grammarcheck‑fr
The following NEW packages will be installed:
  firefox‑locale‑fr gimp‑help‑common gimp‑help‑fr hunspell‑fr
  hunspell‑fr‑classical hyphen‑fr language‑pack‑fr language‑pack‑fr‑base
  language‑pack‑gnome‑fr language‑pack‑gnome‑fr‑base libreoffice‑help‑fr
  libreoffice‑l10n‑fr mythes‑fr thunderbird‑locale‑fr wfrench
0 upgraded, 15 newly installed, 0 to remove and 6 not upgraded.
Need to get 41.6 MB of archives.
After this operation, 115 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
 ...
Setting up language‑pack‑fr‑base (1:16.04+20160627) ...
Generating locales (this might take a while)...
  fr_BE.UTF‑8... done
  fr_CA.UTF‑8... done
  fr_CH.UTF‑8... done
  fr_FR.UTF‑8... done
  fr_LU.UTF‑8... done
Generation complete.
Setting up language‑pack‑gnome‑fr‑base (1:16.04+20160627) ...
Processing triggers for dictionaries‑common (1.26.3) ...
Processing triggers for bamfdaemon (0.5.3~bzr0+16.04.20160824‑0ubuntu1) ...
Rebuilding /usr/share/applications/bamf‑2.index...

现在您已经安装了法语语言支持,可以开始显示星期名称及其缩写了,如清单 11 所示。

清单 11. 使用法语显示星期名称

ian@attic‑u16:~$ LC_ALL=fr_FR.UTF8 locale ‑ck day abday
LC_TIME
day="dimanche;lundi;mardi;mercredi;jeudi;vendredi;samedi"
LC_TIME
abday="dim.;lun.;mar.;mer.;jeu.;ven.;sam."
i

Fedora 使用语言元包来安装特定语言的语言支持。例如,langpacks-es 是用于西班牙语语言支持的元包。清单 12 展示了一个使用 dnf 在我的 Fedora 25 系统上安装西班牙语语言包的示例。在早期的系统上,您可能需要改用 yum

清单 12. 使用 dnf 安装西班牙语语言支持

[root@atticf25 ~]#dnf install langpacks‑es
Last metadata expiration check: 0:06:08 ago on Wed May 31 22:16:08 2017.
Dependencies resolved.
================================================================================
 Package                        Arch    Version                  Repository
                                                                           Size
================================================================================
Installing:
 autocorr‑es                    noarch  1:5.2.7.2‑3.fc25         updates  181 k
 glibc‑langpack‑es              x86_64  2.24‑4.fc25              updates  411 k
 gnome‑getting‑started‑docs‑es  noarch  3.22.0‑1.fc25            fedora    10 M
 hunspell‑es                    noarch  1:0.7‑6.fc24             fedora   251 k
 hyphen‑es                      noarch  0.20110222svn‑8.fc24     fedora    16 k
 langpacks‑es                   noarch  1.0‑8.fc25               fedora   8.5 k
 libreoffice‑langpack‑es        x86_64  1:5.2.7.2‑3.fc25         updates  7.3 M
 man‑pages‑es                   noarch  1.55‑26.fc25             fedora   1.6 M
 mythes‑es                      noarch  0.20150304‑4.fc24        fedora   710 k

Transaction Summary
================================================================================
Install  9 Packages

Total download size: 21 M
Installed size: 49 M
Is this ok [y/N]: y
Downloading Packages:
(1/9): langpacks‑es‑1.0‑8.fc25.noarch.rpm        27 kB/s | 8.5 kB     00:00    

...

Installed:
  autocorr‑es.noarch 1:5.2.7.2‑3.fc25                                           
  glibc‑langpack‑es.x86_64 2.24‑4.fc25                                          
  gnome‑getting‑started‑docs‑es.noarch 3.22.0‑1.fc25                            
  hunspell‑es.noarch 1:0.7‑6.fc24                                               
  hyphen‑es.noarch 0.20110222svn‑8.fc24                                         
  langpacks‑es.noarch 1.0‑8.fc25                                                
  libreoffice‑langpack‑es.x86_64 1:5.2.7.2‑3.fc25                               
  man‑pages‑es.noarch 1.55‑26.fc25                                              
  mythes‑es.noarch 0.20150304‑4.fc24                                            

Complete!

您现在可以使用西班牙语语言环境了。例如,清单 13 展示了西班牙语的星期名称及其缩写。

清单 13. 西班牙语的星期名称及其缩写

[ian@atticf25 ~]$ LANG=es_ES.UTF8 locale ‑ck day abday
LC_TIME
day="domingo;lunes;martes;miércoles;jueves;viernes;sábado"
LC_TIME
abday="dom;lun;mar;mié;jue;vie;sáb"

永久的语言环境更改

如果要在每次登录时使用特定的语言或语言环境设置,那么可以在 .bashrc 配置文件中设置 LANG、LANGUAGE、LCALL 或个别 LC* 设置。当然,在执行此操作之前,您需要安装相应的语言支持包。

要更改系统默认语言,需要安装所需的语言包,然后使用 localectl 命令更改默认系统语言环境设置。您可以更改用于控制台或 X11 终端的语言、LC_* 设置或键映射。这些设置可以在登录之前使用,也可以供不会覆盖它们的任何用户使用。

代码页转换

早期的计算机无法与其他计算机通信,并且每个制造商都会使用一种在内部表示字符的自定义方式。在 1963 年发布了美国信息交换标准代码 (ASCII),其旨在成为一种通用的交换语言。由于它只能表示 127 个字符,因此其在非英语语言中的使用受到限制。标准组织(例如 ISO)和计算机制造商会同时采用多种代码页。在一个系统上使用特定代码页创建的文档不一定能在另一个系统上使用,除非后者也支持相同的代码页或兼容的标准。

在西方国家,另一个广泛使用的标准是 ISO-8859-1,它与 Windows® 代码页 1252 十分相似但不完全相同。它是一种 8 位编码,其中前 127 个字符的编码与 ASCII 相同。ISO-8859-1 可以很好地支持许多西方语言,但是缺少一些字符和一些符号(例如标点符号)。

Unicode 是由 The Unicode Consortium 开发的一种现代编码标准。其目标是帮助世界各地的人们以任何语言使用计算机。Unicode 最初为 16 位编码,但从 1996 年 7 月开始,它能够对 U+0000..U+10FFFF 范围内的字符进行编码,这至少需要 21 位代码空间。下面是三种常用的编码:

  • UTF-8 使用一到四个 8 位字节来表示一个字符,其中范围 0-127 内的字符由一个字节(使用与 ASCII 相同的编码)来表示。
  • UTF-16 使用一个或两个 16 位单元来表示一个字符。
  • UTF-32 使用单个 32 位单元来表示一个字符。

虽然您会在语言环境 -alocale-a 的输出中看到一些其他编码(例如 fr_BE.iso88591),但是您在本教程中到目前为止看到的所有示例使用的都是 UTF-8 编码。

可以使用 iconv 程序在字符编码之间进行转换。显然,如果是从大型字符集转换为小型字符集,那么转换会失败。您可以选择忽略该问题,或者将字符音译为近似值。音译可能会去掉字符的重音符号,或者将不受支持的货币符号替换为短名称(例如,用 EUR 替换 Euro)。

清单 14 展示了在从 UTF-8 转换为 ASCII 的情况下,音译输出与忽略无效字符之间的区别。在第一个示例中,去掉了某些字符的重音符号或变音符号,并将两个字符音译为常见的替代表示形式。在第二个示例中,丢失了文本中的大部分字符,因为无法使用有限的 ASCII 字符集来表示这类字符。

清单 14. 从 UTF-8 转换为 ASCII

ian@attic‑u16:~$ echo abc ß α € àḃç | iconv ‑f UTF‑8 ‑t ASCII//TRANSLIT
abc ss ? EUR abc
ian@attic‑u16:~$ echo abc ß α € àḃç | iconv ‑f UTF‑8 ‑t ASCII//IGNORE
abc    
iconv: illegal input sequence at position 22

如果尝试在相同的示例中使用 ISO-8859-1 代替 ASCII,那么输出中会包含一些奇怪的字符。清单 15 中展示了一个示例,此示例使用了一条会被捕获到文件中的法语错误消息。我将该文件先转换为 ISO-8859-1,然后又将其转换为 UTF-8,这样您就可以看到不同之处,而且此示例不会丢失数据。

清单 15. 无损转换示例

ian@attic‑u16:~$ LANGUAGE=fr_FR ls no‑such‑file 2>ic‑utf8
ian@attic‑u16:~$ cat ic‑utf8
ls: impossible d'accéder à 'no‑such‑file': Aucun fichier ou dossier de ce type
ian@attic‑u16:~$ iconv ‑f ISO‑8859‑1 ‑t UTF‑8 ‑o ic‑utf8 ic‑8859 
ian@attic‑u16:~$ iconv ‑f ISO‑8859‑1 ‑t UTF‑8 ‑o ic‑utf8‑out ic‑8859 
ian@attic‑u16:~$ ls ‑l ic‑*
‑rw‑rw‑r‑‑ 1 ian ian 79 May 31 17:22 ic‑8859
‑rw‑rw‑r‑‑ 1 ian ian 81 May 31 17:23 ic‑utf8
‑rw‑rw‑r‑‑ 1 ian ian 81 May 31 17:24 ic‑utf8‑out
ian@attic‑u16:~$ diff ic‑utf8 ic‑utf8‑out
ian@attic‑u16:~$ diff ‑q ic‑8859 ic‑utf8
Files ic‑8859 and ic‑utf8 differ

时区设置和环境变量

与语言和语言相关设置一样,您可能需要配置时区。您的系统有一个硬件时钟,一旦启动,就有可能与网络时间协议 (NTP) 服务器同步其时间设置。您的公司可以维护自己的 NTP 服务器或服务器池,也可以使用公共服务器,例如 pool.ntp.org(一个大型的时间服务器集群)。

为了能够在数百万台计算机和设备之间同步时间,您需要使用一种时间标准。此标准称为世界标准时间 (UTC)。您还需要使用一些方法来测量 UTC 与当地时间之间的时差。由于地球的自转时间为 24 小时,因此时区通常会跨越一个小时。例如,美国东部标准时间比 UTC 晚 5 个小时(写为 UTC-5)。有些地方(例如南澳大利亚)在时差中使用“半小时”粒度,而不是整个小时。

格林威治标准时间 (GMT) 与 UTC 相同,但不是标准时间。它是在不列颠群岛和其他地方使用的时区。

使用 date 命令可显示您的当前时间和日期信息。您可以选择多种不同的输出格式,还可以根据特定目的进一步自定义输出格式(例如,编写脚本时)。清单 16 中展示了一些示例。

清单 16. 使用 date 命令

ian@attic‑u16:~$ #Date and time in my system format
ian@attic‑u16:~$ date
Wed May 31 18:46:24 EDT 2017
ian@attic‑u16:~$ #Date and time in ISO 8601 format
ian@attic‑u16:~$ date ‑‑iso‑8601
2017‑05‑31
ian@attic‑u16:~$ #Date and time in RFC 2822 format
ian@attic‑u16:~$ date ‑‑rfc‑2822
Wed, 31 May 2017 18:48:27 ‑0400
ian@attic‑u16:~$ #UTC Date and time
ian@attic‑u16:~$ date ‑u
Wed May 31 22:49:21 UTC 2017
ian@attic‑u16:~$ #Date and time at 09:00 next Friday
ian@attic‑u16:~$ date ‑‑date='09:00 next Fri'
Fri Jun  2 09:00:00 EDT 2017
ian@attic‑u16:~$ #What day is today?
ian@attic‑u16:~$ date "+%A"
Wednesday

timedatectl 命令与我之前使用的 localectl 命令有些相似。如果在不使用任何参数的情况下使用此命令,它将显示当前状态,如清单 17 所示。

清单 17. 显示日期和时间信息

ian@attic‑u16:~$ timedatectl
      Local time: Wed 2017‑05‑31 19:04:09 EDT
  Universal time: Wed 2017‑05‑31 23:04:09 UTC
        RTC time: Wed 2017‑05‑31 23:04:09
       Time zone: America/New_York (EDT, ‑0400)
 Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

注意时区规范,该规范包含三个部分。时区名称是 America/New_York。通用缩写是 EDT(东部夏令时间),比 UTC 晚 4 个小时。使用 tzselect 命令可检查您的时区或其他地方时区的格式是否正确。这是一个交互式命令,可引导您进行一些选择。清单 18 展示了如何检查南澳大利亚的时区。

清单 18. 使用 tzselect

ian@attic‑u16:~$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
 1) Africa
 2) Americas
 3) Antarctica
 4) Asia
 5) Atlantic Ocean
 6) Australia
 7) Europe
 8) Indian Ocean
 9) Pacific Ocean
10) coord ‑ I want to use geographical coordinates.
11) TZ ‑ I want to specify the time zone using the Posix TZ format.
#? 6
Please select one of the following time zone regions.
1) Lord Howe Island              8) Queensland (most areas)
2) Macquarie Island              9) Queensland (Whitsunday Islands)
3) Tasmania (most areas)         10) South Australia
4) Tasmania (King Island)         11) Northern Territory
5) Victoria                 12) Western Australia (most areas)
6) New South Wales (most areas)         13) Western Australia (Eucla)
7) New South Wales (Yancowinna)
#? 10

The following information has been given:

    Australia
    South Australia

Therefore TZ='Australia/Adelaide' will be used.
Local time is now:     Thu Jun  1 08:41:27 ACST 2017.
Universal Time is now:     Wed May 31 23:11:27 UTC 2017.
Is the above information OK?
1) Yes
2) No
#? 1

You can make this change permanent for yourself by appending the line
    TZ='Australia/Adelaide'; export TZ
to the file '.profile' in your home directory; then log out and log in again.

Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Australia/Adelaide

注意对 TZ 环境变量的引用。您可能会发现,如果尝试显示 TZ 环境变量,那么表示未设置该环境变量。如输出中所述,如果要使用与系统时区不同的时区,那么可以在 .profile 文件中设置和导出该环境变量。与某些 LC_* 变量一样,您也可以使用此环境变量来影响单个命令(例如,清单 19 中所示的 date 命令)。

清单 19. 使用 TZ 环境变量

ian@attic‑u16:~$ date
Wed May 31 19:25:06 EDT 2017
ian@attic‑u16:~$ TZ='Australia/Adelaide' date
Thu Jun  1 08:55:08 ACST 2017

您的系统会在几个重要位置维护时区信息。某些系统(例如 Ubuntu)会在 /etc/timezone 中维护系统时区名称。/etc/localtime 文件是指向 /usr/share/zoneinfo 目录中时区文件的链接。最后,/usr/share/zoneinfo 目录包含一些用于主要区域(例如美国)的子目录,以及一些用于各个时区的链接或文件。清单 20 展示了 Ubuntu 和 Fedora 系统上的一些示例。

清单 20. 系统时区文件

ian@attic‑u16:~$ #Ubuntu 16.04 LTS
ian@attic‑u16:~$ cat /etc/timezone 
America/New_York
ian@attic‑u16:~$ ls ‑l /etc/localtime 
lrwxrwxrwx 1 root root 36 Dec 23 14:54 /etc/localtime ‑> /usr/share/zoneinfo/America/New_York
ian@attic‑u16:~$ ls ‑l /usr/share/zoneinfo/America/New_York
lrwxrwxrwx 1 root root 13 Dec  7 05:59 /usr/share/zoneinfo/America/New_York ‑> ../posixrules

ian@atticf25 ~]$ #Fedora 25
[ian@atticf25 ~]$ ls /etc/timezone
ls: cannot access '/etc/timezone': No such file or directory
[ian@atticf25 ~]$ ls ‑l /etc/localtime
lrwxrwxrwx.1 root root 38 Apr 26 18:09 /etc/localtime ‑> ../usr/share/zoneinfo/America/New_York
[ian@atticf25 ~]$ ls ‑l /usr/share/zoneinfo/America/New_York
‑rw‑r‑‑r‑‑.3 root root 3545 Mar 27 22:18 /usr/share/zoneinfo/America/New_York

如果需要更改系统日期或时区,可使用 tmedatectl 命令。参阅帮助文档,获取有关可用选项和命令的更多信息。您可以执行诸如打开或关闭 NTP 同步之类的操作,并可以控制如何更新或使用系统实时时钟。

对本地化和时区设置的介绍到此结束。

本文翻译自:Learn Linux, 101: Localisation and internationalisation(2017-07-21)