在系统范围内自定义日期/时间格式的最佳实践?

0xC*_*22L 23 linux date locale

TL; 博士

自定义日期和时间格式设置的最佳实践是什么,同时坚持 DRY 原则,即没有不必要的重复内容?


我想为我的系统专门定制日期和时间格式,同时坚持其余的语言环境。我知道环境变量LC_TIME将使仅通过指向备用语言环境来自定义该方面成为可能。由于我使用的是 Linux(确切地说是 Ubuntu 14.04),我想使用 理解的格式localedef作为输入。

我已经阅读了以下三篇文档:

最后一个特别有帮助。

现在,我只是想自定义的部分LC_TIME,并想继承verything人。

所以我复制en_US到一个名为isodatein的文件/usr/share/i18n/locales并调整了我关心的值。在筛选文档后,我还决定用copy-keyword替换所有其他部分内容。

问题:我不清楚哪种方法应该是最佳实践。有谁知道(或者甚至是我给出的其他替代方案)?

例如,由于我只关心几个值(d_t_fmt, d_fmt, t_fmt, t_fmt_ampm, am_pm, date_fmt),所以继承所有en_USforLC_TIME然后仅用我的类似 ISO 的格式(ISO 8601)覆盖这些值会很好。但是,有关copy状态的文档(重点是我的):

复制

指定将用作此类别定义的现有语言环境的名称。如果指定了该关键字,则不得指定其他关键字。

这意味着我不能简单地输入 acopy然后添加更多关键字。

另外,仅定义该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
Run Code Online (Sandbox Code Playgroud)

ILM*_*o_7 1

正如一些评论中所指出的,您可以复制其余部分并LC_TIME在自定义区域设置文件中进行自定义,或者LC_TIME/etc/locale.conf. 正如locale.conf(5)手册页所建议的,您还可以使用内核命令行选项locale.LC_TIME=来覆盖启动时的设置。

  • 你好。感谢你的回答。我不太明白你对这个问题的编辑,但无论如何。我的主要问题并不是要获得特定的效果(我认为我的问题表明我已经找到了它)。我的问题的核心是是否有一种规范的方法可以做到这一点以及它是什么。我之所以问这个问题,是因为如果没有规范的方式,我就会冒着更改不应该更改的内容的风险,并遇到各种冲突(例如包管理)。您可能没有看到它们,但有三个(现已删除)像您之前的答案。还是+1。 (3认同)