我正在使用 Kubuntu 14.04.2 LTS。我使用以下命令设置语言环境:
export LANG=ru_RU.utf8 LANGUAGE=ru_RU.utf8 LC_ALL=ru_RU.utf8
Run Code Online (Sandbox Code Playgroud)
所以locale现在说所有条目都是ru_RU.utf8. 但是当我发出时date,我得到以下信息:
??. ??? 14 12:55:36 MSK 2015
Run Code Online (Sandbox Code Playgroud)
虽然用英语说“May 14”是正常的,但我们从不用俄语说“??? 14”(这意味着“5月14日”而不是“5月14日”)。它应该是“14 ???” 或者,最坏的情况是“???,14”。
根据info coreutils 'date invocation',在C语言环境中,默认格式字符串是'+%a %b %e %H:%M:%S %Z %Y',它看起来正是我在ru_RU.utf8语言环境中得到的。但是同一个信息页面说格式字符串取决于LC_TIME语言环境类别。因此,我得出结论,系统语言环境数据库中某处存在错误。
这确实是一个错误,还是我错过了什么?
这不是错误date;它是由中的定义引起的LC_TIME。根据info页面:
调用没有格式参数的日期相当于调用它 使用取决于LC_TIME语言环境类别的默认格式。
现在,如果您打开/usr/share/i18n/locales/ru_RU,LC_TIME您将看到date_fmt(日期/时间格式)定义为:
date_fmt "<U0025><U0061><U0020><U0025><U0062><U0020><U0025><U0065>/
<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/
<U0025><U005A><U0020><U0025><U0059>"
Run Code Online (Sandbox Code Playgroud)
转换为%a %b %e %H:%M:%S %Z %Y,即:
%a- 语言环境的缩写工作日名称(例如??)
%b- 语言环境的缩写月份名称(例如???)
%e- 月份中的日期,填充空格;与%_d(例如14)
等相同...
所以,如果您编辑文件并交换两个转换说明符%b和%e(即交换<U0062>和<U0065>):
date_fmt "<U0025><U0061><U0020><U0025><U0065><U0020><U0025><U0062>/
<U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053><U0020>/
<U0025><U005A><U0020><U0025><U0059>"
Run Code Online (Sandbox Code Playgroud)
然后运行locale-gen,您将获得正确的日期格式:
LC_TIME=ru_RU.utf8 date
?? 14 ??? 13:27:14 MSK 2015
Run Code Online (Sandbox Code Playgroud)
上述文件的最后修订日期(截至 2015 年 5 月 14 日)似乎是2013 年 11 月 14 日,因此请随时报告错误:bug-glibc-locales@gnu.org