Locale

為什麼date在本地化時以錯誤的字序列印日期?

  • May 14, 2015

我正在使用 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語言環境類別。因此,我得出結論,系統語言環境數據庫中的某個地方存在錯誤。

這確實是一個錯誤,還是我錯過了什麼?

這不是 ; 中的錯誤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>"

轉換為%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>"

然後執行locale-gen,你會得到正確的日期格式:

LC_TIME=ru_RU.utf8 date
Чт 14 май 13:27:14 MSK 2015

上述文件的最後修訂日期(截至 2015 年 5 月 14 日)似乎是2013年 11 月 14 日,因此請隨時報告錯誤:bug-glibc-locales@gnu.org

引用自:https://unix.stackexchange.com/questions/203354