初步备注:这个问题是不是有关设置通过更改语言环境LC_ALL
,LC_TIME
,LANG
等等,这是相当要改变一个区域的定义,在例如/usr/share/i18n/locales/de_DE
,或者说,以获取有关比改变这些系统设置更合适的选择建议。
的目的是获得ISO时间表示 %Y-%m-%d
,并%H:%M:%S
没有不良副作用。
我在网上发现的建议都不合适(例如,将语言环境设置为“丹麦语”将不会保留母语拼写的工作日名称)。
现在,我目前看到的获得所需行为的唯一选择是在/usr/share/i18n/locales/de_DE
. 这不是一个完美的解决方案,因为随着系统更新,这些更改的文件可能会再次被覆盖。
我的问题是:
LC_*
设置中使用它会更好吗?(以及如何正确地使系统知道该新文件/定义?)在最近的一个问题中,我询问了这种更改的最佳实践是什么。还没有答案。但是,我可以给你我正在使用的食谱,事实证明它很好用。所有程序都正确地选择了日期。
我的描述适用于 Ubuntu,但可能适用于 Debian 和 Mint。
将要自定义的语言环境复制/usr/share/i18n/locales
到新文件中。例如
cp /usr/share/i18n/locales/de_DE /usr/share/i18n/locales/de_DE@isodate
Run Code Online (Sandbox Code Playgroud)
调整除部分之外的所有LC_TIME
内容:
copy "de_DE"
Run Code Online (Sandbox Code Playgroud)
调整LC_TIME
部分以匹配您想要的结果。您可以使用我上面链接问题中的设置作为模板。看起来这几乎正是您想要的。
如果您的语言环境不使用“AM/PM”符号,请将它们设置为空:
t_fmt_ampm ""
am_pm "";""
Run Code Online (Sandbox Code Playgroud)
编辑文件/var/lib/locales/supported.d/local
并在那里添加有关您的语言环境定义的信息。即,如果上面的文件名是isodate
,则添加这样的行,否则进行调整:
de_DE.UTF-8@isodate UTF-8
Run Code Online (Sandbox Code Playgroud)
如果/var/lib/locales/supported.d/local
不存在,则创建一个具有该名称的文件。不要将更改放入该文件夹中的相应en
或de
文件,因为一旦系统上的language-pack-*-base
和language-pack-*
包收到更新,它们可能会被覆盖。
现在运行dpkg-reconfigure locales
:
# dpkg-reconfigure locales
Generating locales...
de_DE.UTF-8@isodate... done
de_DE.UTF-8... up-to-date
Generation complete.
Run Code Online (Sandbox Code Playgroud)
在您的情况下,这将表明de_DE.UTF-8@isodate
语言环境已生成(假设您没有语法问题)。
最后但并非最不重要的是将以下内容添加到/etc/default/locale
:
LC_TIME="de_DE.UTF-8@isodate"
Run Code Online (Sandbox Code Playgroud)
这将确保仅 LC_TIME
覆盖使用LANG
.
重新登录,您应该能够在使用date
或使用相应 libc 运行时功能的其他工具时看到新的 ISO 日期/时间。
这里的目的是进行最少侵入性的更改,同时也不会对系统起作用(例如,对包管理器和朋友)。当然,您也可以简单地创建您的区域设置的副本,以上述类似的方式安装它,然后调整LANG
. 关键是,只要您不想冒更改被包更新覆盖的风险,您就必须使用自定义副本(无论您进行何种自定义;即,copy
或者只是将部分保持原样原本的)。以及您是否更改LANG
为指向完全自定义的区域设置定义 -或者您是否添加 LC_TIME
仅指向自定义区域设置定义文件的同名的相关自定义部分 - 您将无法调整全局设置之一。