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

Rus*_*lan 2 locale

我正在使用 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语言环境类别。因此,我得出结论,系统语言环境数据库中某处存在错误。

这确实是一个错误,还是我错过了什么?

don*_*sti 6

这不是错误date;它是由中的定义引起的LC_TIME。根据info页面:

调用没有格式参数的日期相当于调用它
使用取决于LC_TIME语言环境类别的默认格式。

现在,如果您打开/usr/share/i18n/locales/ru_RULC_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

  • 您可以使用“locale date_fmt”查询“date_fmt”。另见`locale -k LC_TIME` (6认同)