为什么“date”在本地化时打印的日期的词序错误?

为什么“date”在本地化时打印的日期的词序错误?

我正在使用 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)等相同
...
因此,如果您编辑文件并交换两个转换说明符%band %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]

相关内容