Ubuntu 服务器 20.04-使用 date 命令在 shell 上将时间格式设置为 24 小时

Ubuntu 服务器 20.04-使用 date 命令在 shell 上将时间格式设置为 24 小时

我已经安装了 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

有了这个:

  • LANGLC_*指定任何未明确设置的变量的默认值(不包括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/localeLANG=C.UTF-8

相关内容