长话短说
自定义日期和时间格式设置的最佳实践是什么,同时坚持 DRY 原则,即不重复不必要的内容?
我想要定制仅日期和时间格式对于我的系统,同时保持语言环境的其余部分不变。我知道环境变量LC_TIME
将使得仅通过指向备用区域设置就可以自定义该方面。由于我使用的是 Linux(准确地说是 Ubuntu 14.04),因此我想使用 理解的格式作为localedef
输入。
我已阅读以下三篇文档:
- http://pubs.opengroup.org/onlinepubs/009696699/basedefs/xbd_chap07.html
- http://manpages.ubuntu.com/manpages/trusty/man1/localedef.1posix.html
- https://ccollins.wordpress.com/2009/01/06/how-to-change-date-formats-on-ubuntu/
最后一个特别有帮助。
现在我仅有的想要自定义该部分LC_TIME
并想继承其他一切。
所以我复制到一个名为in 的en_US
文件并调整我关心的值。在筛选文档后,我决定还用- 关键字替换所有其他部分内容。isodate
/usr/share/i18n/locales
copy
问题:我不清楚哪种方法应该是最佳实践。有谁知道这一点(或者甚至是我给出的替代方案)?
例如,由于我只关心几个值(d_t_fmt
, d_fmt
, t_fmt
, t_fmt_ampm
, am_pm
, date_fmt
),所以很高兴继承全部en_US
为LC_TIME
,然后仅使用我的类似 ISO 的格式 (ISO 8601) 覆盖这些值。但是,有关状态的文档copy
(重点是我的):
复制
指定现有语言环境的名称,该语言环境将用作该类别的定义。如果指定了该关键字,不得指定其他关键字。
这意味着我不能简单地添加一个copy
然后添加更多关键字。
另外,仅定义该LC_TIME
部分可能是合法的,还是会localedef
彻底拒绝编译该部分?
到目前为止我想到了什么:
escape_char /
comment_char %
LC_IDENTIFICATION
copy "en_US"
END LC_IDENTIFICATION
LC_CTYPE
copy "en_US"
END LC_CTYPE
LC_COLLATE
copy "en_US"
END LC_COLLATE
LC_MONETARY
copy "en_US"
END LC_MONETARY
LC_NUMERIC
copy "en_US"
END LC_NUMERIC
LC_TIME
abday "<U0053><U0075><U006E>";"<U004D><U006F><U006E>";/
"<U0054><U0075><U0065>";"<U0057><U0065><U0064>";/
"<U0054><U0068><U0075>";"<U0046><U0072><U0069>";/
"<U0053><U0061><U0074>"
day "<U0053><U0075><U006E><U0064><U0061><U0079>";/
"<U004D><U006F><U006E><U0064><U0061><U0079>";/
"<U0054><U0075><U0065><U0073><U0064><U0061><U0079>";/
"<U0057><U0065><U0064><U006E><U0065><U0073><U0064><U0061><U0079>";/
"<U0054><U0068><U0075><U0072><U0073><U0064><U0061><U0079>";/
"<U0046><U0072><U0069><U0064><U0061><U0079>";/
"<U0053><U0061><U0074><U0075><U0072><U0064><U0061><U0079>"
week 7;19971130;7
first_weekday 1
first_workday 2
abmon "<U004A><U0061><U006E>";"<U0046><U0065><U0062>";/
"<U004D><U0061><U0072>";"<U0041><U0070><U0072>";/
"<U004D><U0061><U0079>";"<U004A><U0075><U006E>";/
"<U004A><U0075><U006C>";"<U0041><U0075><U0067>";/
"<U0053><U0065><U0070>";"<U004F><U0063><U0074>";/
"<U004E><U006F><U0076>";"<U0044><U0065><U0063>"
mon "<U004A><U0061><U006E><U0075><U0061><U0072><U0079>";/
"<U0046><U0065><U0062><U0072><U0075><U0061><U0072><U0079>";/
"<U004D><U0061><U0072><U0063><U0068>";/
"<U0041><U0070><U0072><U0069><U006C>";/
"<U004D><U0061><U0079>";/
"<U004A><U0075><U006E><U0065>";/
"<U004A><U0075><U006C><U0079>";/
"<U0041><U0075><U0067><U0075><U0073><U0074>";/
"<U0053><U0065><U0070><U0074><U0065><U006D><U0062><U0065><U0072>";/
"<U004F><U0063><U0074><U006F><U0062><U0065><U0072>";/
"<U004E><U006F><U0076><U0065><U006D><U0062><U0065><U0072>";/
"<U0044><U0065><U0063><U0065><U006D><U0062><U0065><U0072>"
% Appropriate date and time representation (%c)
% "%Y-%m-%d %H:%M:%S"
d_t_fmt "<U0025><U0059><U002D><U0025><U006D><U002D><U0025><U0064><U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>"
%
% Appropriate date representation (%x)
% "%Y-%m-%d"
d_fmt "<U0025><U0059><U002D><U0025><U006D><U002D><U0025><U0064>"
%
% Appropriate time representation (%X)
% "%H:%M:%S"
t_fmt "<U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>"
%
t_fmt_ampm ""
%
am_pm "";""
%
% Appropriate date representation (date(1)) "%Y-%m-%d %H:%M:%S"
date_fmt "<U0025><U0059><U002D><U0025><U006D><U002D><U0025><U0064><U0020><U0025><U0048><U003A><U0025><U004D><U003A><U0025><U0053>"
END LC_TIME
LC_MESSAGES
copy "en_US"
END LC_MESSAGES
LC_PAPER
copy "en_US"
END LC_PAPER
LC_NAME
copy "en_US"
END LC_NAME
LC_ADDRESS
copy "en_US"
END LC_ADDRESS
LC_TELEPHONE
copy "en_US"
END LC_TELEPHONE
LC_MEASUREMENT
copy "en_US"
END LC_MEASUREMENT
答案1
正如一些评论中所指出的,您可以复制其余部分并LC_TIME
在自定义区域设置文件中进行自定义,或者LC_TIME
在/etc/locale.conf
.正如locale.conf(5)
手册页所建议的,您还可以使用内核命令行选项locale.LC_TIME=
来覆盖启动时的设置。