我的问题看起来应该很简单,但我很惊讶我找不到答案。
我住在加拿大,所以 en_CA.UTF8 或 en_US.UTF8 是最合适的区域设置,但我真的不喜欢它们的日期/时间格式。我同意 xkcd (https://xkcd.com/1179/)有一种格式化日期的方法:yyyy-mm-dd。我什至已经习惯使用24小时制来计时。
所以这是一个完全的对我来说是灾难,格式为 en_US.UTF8:“Sat 27 Jan 2018 05:20:38 PM EST”
我确信一定是使用以下变体的语言环境
%Y-%m-%d %H:%M:%S %Z
适用于 d_fmt、d_t_fmt、date_fmt 等,但我找不到哪些语言环境使用哪些格式的参考。
我见过这个问题在系统范围内自定义日期/时间格式的最佳实践?它没有回应,所以我选择询问一个新的,因为我的略有不同,我不想自定义区域设置,我希望能够指定
LC_TIME=??
并获得“正确”的格式。就我而言,理想的答案是一份参考文档,其中详细介绍了各种语言环境所使用的格式,以便我可以选择最接近我想要的 LC_TIME 。
顺便说一句,我已经完成了使用我满意的设置手动修改 en_CA.UTF8 的练习,但这在多个环境中执行起来太耗时,必须有一种更简单的方法。
答案1
大多数 Linux 系统上的区域设置数据定义在源glibc
代码;我将解释如何使用它来查找匹配的区域设置。
在存储库的克隆中,进入localedata/locales
;这里每个区域设置都是一个单独的文件,日期格式由条目确定d_fmt
(d_t_fmt
日期和时间)。如您所料,它们使用%d
、%m
、 和%y
,但通常编码为 Unicode 代码点;%
is <U0025>
、d
is <U0064>
、m
is<U006D>
和y
is <U0079>
,其大写对应项高 32 点。
跑步
grep -iE 'd_t_fmt.*(%|<U0025>)(y|<U00[57]9>).*(%|<U0025>)(m|<U00[46]D>).*(%|<U0025>)(d|<U00[46]4>)' *
列出了一些候选者,其中en_DK
可能是最合适的:
$ LC_TIME=en_DK date +%x
2018-02-11
答案2
正如 @Stephen Kitt 提到的en_DK
你正在寻找的位置,我也使用 if 应用程序来确定它们运行的语言环境中的日期格式,所以例如thunderbird
我有一个像这样的包装脚本来覆盖它。
〜/ bin /雷鸟
#!/bin/bash
export LC_TIME=en_DK # or whatever you want
[ "$LC_ALL" != "$LC_TIME" ] && unset LC_ALL # only necessary if set to something different from LC_TIME
exec /usr/bin/thunderbird "$@"
答案3
查看每个区域设置并将其打印出来:
ls /usr/share/i18n/locales/ | while read myLC
do
echo "# $myLC"
TZ=Europe/Paris LC_TIME=$myLC date +%c
done
然后,您可以使用 before (-B) 对此列表进行 grep,如下所示:
ls /usr/share/i18n/locales/ |while read myLC;do echo "# $myLC";TZ=Europe/Paris LC_TIME=$myLC date +%c;done |grep -B1 2022-04
打印出:
# en_DK
2022-04-22T10:58:54 CEST
--
# si_LK
2022-04-22 10:58:54 +0200
有关不同 TZ 时区的列表,请参阅 /usr/share/zoneinfo/zone.tab