所以我有 2 个不同的 Linux 安装。其中之一是Ubuntu,第二个是Kali。
当我date
在 Ubuntu 安装上运行不带选项/参数的命令时,我得到:
michal@ubuntu:~$ date
Thu 24 Mar 2022 07:56:23 PM CET
当我date
在 Kali 安装上运行不带选项/参数的命令时,我得到:
┌──(michal㉿kali)-[~]
└─$ date
Thu Mar 24 07:58:34 PM CET 2022
两台机器上的区域设置是相同的: Ubuntulocale
设置:
michal@ubuntu:~$ locale
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=
和卡利locale
设置:
┌──(michal㉿kali)-[~]
└─$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
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=
为什么date
两台机器上的命令输出不同?
我想永久更改 Kali 输出,使其与我当前的 Ubuntu 输出相同:
michal@ubuntu:~$ date
Thu 24 Mar 2022 07:56:23 PM CET
需要编辑哪个文件?这些设置在哪里?
我尝试按照该线程中的步骤进行操作:
如何更改默认日期格式(使用 LC_TIME)?
但我不明白什么:“date
的 texinfo 还明确建议将 LC_TIME 设置为 C为了产生独立于语言环境的输出。”的意思。
答案1
您可以知道date
它应该如何格式化其输出:
%% a literal %
%a locale's abbreviated weekday name (e.g., Sun)
%A locale's full weekday name (e.g., Sunday)
%b locale's abbreviated month name (e.g., Jan)
%B locale's full month name (e.g., January)
%c locale's date and time (e.g., Thu Mar 3 23:05:25 2005)
%C century; like %Y, except omit last two digits (e.g., 20)
%d day of month (e.g., 01)
%D date; same as %m/%d/%y
%e day of month, space padded; same as %_d
%F full date; like %+4Y-%m-%d
%g last two digits of year of ISO week number (see %G)
%G year of ISO week number (see %V); normally useful only with %V
%h same as %b
%H hour (00..23)
%I hour (01..12)
%j day of year (001..366)
%k hour, space padded ( 0..23); same as %_H
%l hour, space padded ( 1..12); same as %_I
%m month (01..12)
%M minute (00..59)
%n a newline
%N nanoseconds (000000000..999999999)
%p locale's equivalent of either AM or PM; blank if not known
%P like %p, but lower case
%q quarter of year (1..4)
%r locale's 12-hour clock time (e.g., 11:11:04 PM)
%R 24-hour hour and minute; same as %H:%M
%s seconds since the Epoch (1970-01-01 00:00 UTC)
%S second (00..60)
%t a tab
%T time; same as %H:%M:%S
%u day of week (1..7); 1 is Monday
%U week number of year, with Sunday as first day of week (00..53)
%V ISO week number, with Monday as first day of week (01..53)
%w day of week (0..6); 0 is Sunday
%W week number of year, with Monday as first day of week (00..53)
%x locale's date representation (e.g., 12/31/99)
%X locale's time representation (e.g., 23:13:48)
%y last two digits of year (00..99)
%Y year
%z +hhmm numeric time zone (e.g., -0400)
%:z +hh:mm numeric time zone (e.g., -04:00)
%::z +hh:mm:ss numeric time zone (e.g., -04:00:00)
%:::z numeric time zone with : to necessary precision (e.g., -04, +05:30)
%Z alphabetic time zone abbreviation (e.g., EDT)
在您的情况下,命令如下:
date +"%a %d %b %Y %r %Z"
通过设置别名,您可以更改date
命令的行为:
alias date='date +"%a %d %b %Y %r %Z"'
您可以将别名放入您的帐户中,~/.bashrc
以使当前用户的更改永久生效。
答案2
命令的默认格式date(1)
深埋在语言环境系统中(具体来说,是date_fmt
中的设置LC_TIME
)。 Locale 是用于指定与位置相关的内容的系统,例如一周中的哪一天首先出现、纸张大小、电话号码格式、是 d/m/y 还是 m/d/y 以及每个数字的位数等。
2018 年 Ubuntu 18.04LTS 发布后,(美国英语)用户的默认设置date(1)
发生了变化。en_US
在美国,date(1)
在高于 18.04 的 Ubuntu 版本中,该命令生成的日期采用 12 小时制,其中包含 AM 或 PM。我不知道其他发行版做了什么或什么时候做的。
C/POSIX 语言环境是一种与位置无关的语言环境,保证永远不会更改。这几乎就是 Unix 系统在开始调整语言环境之前所做的事情。它的语言环境称为 C。
根据您的情况,您有多种选择:
如果您没有依赖于使用该
date(1)
命令的旧数据的软件,您可以考虑继续使用它。事实上,在美国,人们使用 12 小时制和 AM/PM。如果像我一样,您想继续
date(1)
在脚本中使用以特定格式生成日期,则可以在命令行中使用格式说明符:$ date +"%a %b %e %H:%M:%S %Z %Y" Mon Jun 12 15:30:44 EDT 2023
您还可以指定与环境变量一起使用的区域设置
LANG
,并将其设置为 C:$ LANG=C date Mon Jun 12 15:30:44 EDT 2023
可以为给定的 shell 设置
$ export LANG=C $ date Mon Jun 12 15:30:44 EDT 2023
如果您希望每个 shell 都使用它,请将
export LANG=C
行放入~/.bash_aliases
.如果您想要
date(1)
生成不带参数的给定格式,即使是由其他用户调用或不是从 shell 调用,那么您需要更改该date(1)
命令的系统默认格式。这涉及更多一点:# Modify one line in the en_US locale file: cd /usr/share/i18n/locales sed -e '/date_fmt/ s/%r/%H:%M:%S/' en_US > en_US@Cdate # List it as a supported locale: cat >> /etc/locale.gen << EOF [email protected] UTF-8 EOF # compile the locale database locale-gen # select the new locale (modifies /etc/default/locale) update-locale [email protected]
这对新登录生效。