為什麼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
語言環境類別。因此,我得出結論,系統語言環境數據庫中的某個地方存在錯誤。這確實是一個錯誤,還是我錯過了什麼?
這不是 ; 中的錯誤
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
(例如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