我正在使用 Kubuntu 14.04.2 LTS。我使用以下命令设置语言环境:
export LANG=ru_RU.utf8 LANGUAGE=ru_RU.utf8 LC_ALL=ru_RU.utf8
所以locale
现在说所有条目都是ru_RU.utf8
.但是当我发出 时date
,我得到以下信息:
Чт. мая 14 12:55:36 MSK 2015
虽然用英语说“May 14”是很正常的,但我们从不用俄语说“мая 14”(它的意思是“of May 14th”而不是“14th of May”)。它应该是“14 мая”,或者最坏的情况是“май, 14”。
根据info coreutils 'date invocation'
,在C
语言环境中,默认格式字符串是'+%a %b %e %H:%M:%S %Z %Y'
,它的显示与我通过语言环境得到的完全一样ru_RU.utf8
。但同一信息页面表示格式字符串取决于LC_TIME
区域设置类别。因此,我得出的结论是系统区域设置数据库中存在错误。
这确实是一个错误,还是我错过了什么?
答案1
这不是一个错误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>"
翻译为%a %b %e %H:%M:%S %Z %Y
,即:
%a
- 语言环境的工作日缩写名称(例如Чт
)
%b
- 语言环境的月份缩写名称(例如май
)
%e
- 月份中的某一天,空格填充;与%_d
(eg 14
)等相同
...
因此,如果您编辑文件并交换两个转换说明符%b
and %e
(即交换<U0062>
and <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>"
然后运行locale-gen
,你将得到正确的日期格式:
LC_TIME=ru_RU.utf8 date
Чт 14 май 13:27:14 MSK 2015
上述文件的最后修订日期(截至 2015 年 5 月 14 日)似乎是2013-11-14所以请随意报告错误:[email protected]