我已经安装了 Ubuntu 服务器 20.04,当我在 shell 中使用命令“date”时,我找不到将时间格式显示为 24 小时的方法。我使用 Ubuntu 服务器 18.04 检查了区域设置信息,一切似乎都一样,但在 18.04 上,我的日期格式为 24 小时
Mon May 11 22:41:08 CEST 2020
而在 20.04 中则“不同”,并且采用 12 小时格式
Mon 11 May 2020 10:41:40 PM CEST
以下是 Ubuntu 18.04 语言环境命令的结果
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Ubuntu 20.04
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
这是 localectl 命令的结果
Ubuntu 18.04
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: it
X11 Model: pc105
Ubuntu 20.04
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: it
X11 Model: pc105
我不知道在哪里可以像在 Ubuntu 18.04 中那样将时间更改为 24 小时格式。有人可以帮我吗?
谢谢
答案1
最简单的方法是将LC_TIME
变量更改为使用所需时间格式的区域设置。en_GB
例如,使用 24 小时制。您可以使用以下方式在系统范围内进行设置localectl
:
localectl set-locale LC_TIME="en_GB.UTF-8"
然后,您必须重新登录才能看到更改。
或者,您可以在语言环境定义文件中自定义日期和时间格式/usr/share/i18n/locales/en_US
。您将在以下部分找到日期和时间格式:
% Appropriate date and time representation (%c)
d_t_fmt "%a %d %b %Y %r %Z"
%
% Appropriate date representation (%x)
d_fmt "%m//%d//%Y"
%
% Appropriate time representation (%X)
t_fmt "%r"
%
% Appropriate AM/PM time representation (%r)
t_fmt_ampm "%I:%M:%S %p"
%
% Appropriate date and time representation for date(1)
date_fmt "%a %d %b %Y %r %Z"
在这种情况下,要获得 24 小时制时钟,您必须替换%r
并%T
运行locale-gen
以重新生成区域设置。
答案2
要date
显示 24 小时时间,您需要设置LC_TIME="C.UTF-8"
。
在 Ubuntu 22.04 上sudo localectl set-locale LC_TIME=C.UTF-8
仅更新/etc/locale.conf
,这似乎对的输出没有任何影响date
,即使注销并重新登录后也是如此。重新启动不会影响的输出date
。
但是,改变设置/etc/default/locale
会改变输出,date
因此它显示 24 小时制时间。
因此添加这一行到/etc/default/locale
:
LC_TIME="C.UTF-8"
答案3
答案表明,添加LC_TIME=C.UTF-8
到环境中将可以解决问题,但并没有像我所写的那样起到作用。
什么做过使其工作,是编辑/etc/default/locale
为:
LANG=en_US.UTF-8 LC_ALL= LC_TIME=C.UTF-8
有了这个:
LANG
LC_*
指定任何未明确设置的变量的默认值(不包括LC_ALL
);LC_ALL
设置为空,以防止其推翻任何单独的LC_*
设置;LC_TIME
如前所述,设置为允许date
使用 24 小时格式生成时间值的值;
您现在可能已经猜到了,LC_TIME=C.UTF-8
仅仅添加是不够的,因为在我的系统上 - 一个全新22.04
安装的 Ubuntu -LC_ALL
也被设置为(为en_US.UTF-8
),这阻止了任何LC_*
自定义的实施。
命令行工具的输出locale
有助于明确这一点;无论LANG
设置了什么LC_*
环境变量,它都会显示当前有效的语言环境类别:
LC_ALL
价值高于一切:LANG=whatever LC_ALL=en_US.UTF-8 LC_TIME=C.UTF-8 locale
LANG=whatever LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=en_US.UTF-8
LANG
为任何未设置的类别提供默认值LC_*
:LANG=en_US.UTF-8 LC_ALL= LC_TIME=C.UTF-8 locale
LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME=C.UTF-8 LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT="en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
POSIX
即使LANG
未设置,也有一个默认值 ( ):LANG= LC_ALL= LC_TIME=C.UTF-8 locale
LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME=C.UTF-8 LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL=
查看为您设置的环境变量:
env | egrep '^(LANG|LC_)'
...现在应该有助于理解locale
当前有效的区域设置类别的报告;
在全新22.04
安装的 Ubuntu 上,env | egrep '^(LANG|LC_)'
报告:
LANG=C.UTF-8 LC_ALL=en_US.UTF-8
然而,etc/default/locale
仅包含:
LANG=C.UTF-8
我还没有找到这个默认设置的起源LC_ALL
,但它确实解释了为什么只添加LC_CTIME=C.UTF-8
没有任何效果,和为什么C.UTF-8
不像建议的那样是默认类别值LANG=C.UTF-8
。
更详细的输出locale
还有助于理解 Ubuntu 与早期版本之间观察到的行为差异22.04
;
date
要显示默认使用的确切格式字符串,请使用:
locale date_fmt
乌本图
22.04
:命令 输出 LC_ALL=C.UTF-8 locale date_fmt
%a %b %e %H:%M:%S %Z %Y
LC_ALL=en_US.UTF-8 locale date_fmt
%a %b %e %r %Z %Y
乌本图
18.04
:命令 输出 LC_ALL=C.UTF-8 locale date_fmt
%a %b %e %H:%M:%S %Z %Y
LC_ALL=en_US.UTF-8 locale date_fmt
%a %b %e %H:%M:%S %Z %Y
这表明这是由于en_US.UTF-8
这些系统之间的区域设置配置本身的差异造成的。
LANG
和环境变量LC_ALL
实际上具有完全相同的值;
答案4
发现LC_ALL
环境变量的值与您在 中所做的任何设置相抵消的一个可能原因/etc/default/locale
可能是在 Ubuntu 上,/etc/ssh/sshd_conf
默认情况下有一个AcceptEnv LANG LC_*
指令,导致当客户端将其传递给另一台机器时,任何本地设置的LC_ALL
值都会被愉快地接受ssh
。
LC_ALL=en_US.UTF8
事实证明,这是我在一台试图成为唯一的机器上遇到的最终原因C.UTF8
- 而原因我最初采取的方法是重置LC_ALL
为空字符串来抵消它/etc/default/locale
;
最终的解决方案是注释掉来自 的违规指令/etc/ssh/sshd_conf
,并设置/etc/default/locale
为LANG=C.UTF-8
。