如何在 Linux 中全局将日期格式设置为 ISO?

如何在 Linux 中全局将日期格式设置为 ISO?

我想将 Linux 日期格式全局设置为 ISO,大致如下所示:

YYYY-MM-DD HH:MM:SS
2009-03-16 15:20:00

具有不同程度的细节,如省略时间、秒数等。

我知道对于某些应用程序,您可以手动配置此功能,但我希望它可以为每个程序自动设置。

我特别使用 Ubuntu Intrepid,但适用于所有发行版的通用解决方案是最好的。

答案1

将您的区域设置日期环境变量设置LC_TIME为“en_DK”在您的或类似的环境中进行设置.bashrc,或者检查man locale如何在系统范围内设置它。

ArchLinux所有区域设置/etc/rc.conf和自定义设置均在/etc/rc.local

#!/bin/bash
# Local multi-user startup script
export LC_TIME="en_DK"

答案2

答案3

locale.conf使用编辑器打开

# $EDITOR /etc/locale.conf

并插入行

TIME_STYLE=iso

保存文件后运行

# locale-gen
# env-update && source /etc/profile

并测试结果

# ls -al /home
drwxr-xr-x   8 root             root      4096 2011-12-2  .
...

答案4

我希望这通常是可行的,但 POSIX 语言环境类别只有这么多格式,其中大多数对应于更具有历史意义的格式/场景,但如果你做对d_fmtt_fmt,事情似乎会有所改善。前段时间,我在 Debian GNU/Linux (glibc) 系统上创建了一个尽可能接近完整 ISO 8601 语言环境的语言环境。

正确执行此操作的方法并不完全简单。您必须创建一个自己的完整语言环境,即使您只将其用于LC_CTIME。您必须手动编辑一些值,但仅限于日期/时间;幸运的是,您可以只包含其他值的默认值。

de_DE我已经为(或者更确切地说)完成了此操作,de_DE.UTF-8作为基本语言环境。生成的语言环境定义文件如下所示(请继续阅读以下内容):

comment_char %
escape_char /

% $MirOS: contrib/hosted/tg/deb/de_DE@iso8601,v 1.1 2021/04/05 21:13:47 tg Exp $
%-
% This is an alternative locale definition file, GNU libc compatible,
% which provides an LC_TIME category that is mostly conformant to DIN
% 5008 and ISO 8601. It uses %-d as an extension (use the alternative
% date_fmt if not supported); the timezone offset is rendered without
% colon due to https://bugs.debian.org/799476 which is not proper but
% the best we can currently do; date +'%Y-%m-%dT%H:%M:%S%:z' works.
%
% Install with:
% $ sudo localedef -i de_DE@iso8601 -f UTF-8 -c de_DE.UTF-8@iso8601

% glibc
LC_IDENTIFICATION
title     "German locale for Germany with DIN ISO 8601 date/time format"
source    "BOSng"
contact   "mirabilos"
language  "German"
territory "Germany"
revision  "1.0"
date      "2021-04-04"

category "i18n:2012";LC_IDENTIFICATION
category "i18n:2012";LC_CTYPE
category "i18n:2012";LC_COLLATE
category "i18n:2012";LC_TIME
category "i18n:2012";LC_NUMERIC
category "i18n:2012";LC_MONETARY
category "i18n:2012";LC_MESSAGES
category "i18n:2012";LC_PAPER
category "i18n:2012";LC_NAME
category "i18n:2012";LC_ADDRESS
category "i18n:2012";LC_TELEPHONE
category "i18n:2012";LC_MEASUREMENT
END LC_IDENTIFICATION

% POSIX
LC_CTYPE
copy "de_DE"
END LC_CTYPE

% POSIX
LC_COLLATE
copy "de_DE"
END LC_COLLATE

% POSIX
LC_TIME
abday         "So";"Mo";"Di";"Mi";"Do";"Fr";"Sa"
day           "Sonntag";/
              "Montag";/
              "Dienstag";/
              "Mittwoch";/
              "Donnerstag";/
              "Freitag";/
              "Samstag"
abmon         "Jan.";/
              "Feb.";/
              "M<U00E4>rz";/
              "Apr.";/
              "Mai";/
              "Juni";/
              "Juli";/
              "Aug.";/
              "Sep.";/
              "Okt.";/
              "Nov.";/
              "Dez."
mon           "Januar";/
              "Februar";/
              "M<U00E4>rz";/
              "April";/
              "Mai";/
              "Juni";/
              "Juli";/
              "August";/
              "September";/
              "Oktober";/
              "November";/
              "Dezember"
% this *should* be the first line; GNU cannot even do its own extensions right
%d_t_fmt      "%Y-%m-%dT%H:%M:%S%:z (%Z), %G-W%V-%u (%a)"
d_t_fmt       "%Y-%m-%dT%H:%M:%S%z (%Z), %G-W%V-%u (%a)"
d_fmt         "%Y-%m-%d"
t_fmt         "%H:%M:%S"
am_pm         "";""
t_fmt_ampm    ""
week          7;19971130;4
first_weekday 2
first_workday 2
cal_direction 1
% use the second line if %-d does not work for you
date_fmt      "%A, %-d. %B %Y, %H:%M:%S %Z"
%date_fmt     "%a %Y-%m-%d, %H:%M:%S %Z"
END LC_TIME

% POSIX
LC_NUMERIC
copy "de_DE"
END LC_NUMERIC

% POSIX
LC_MONETARY
copy "de_DE"
END LC_MONETARY

% POSIX
LC_MESSAGES
copy "de_DE"
END LC_MESSAGES

% glibc
LC_PAPER
copy "de_DE"
END LC_PAPER

% glibc
LC_NAME
copy "de_DE"
END LC_NAME

% glibc
LC_ADDRESS
copy "de_DE"
END LC_ADDRESS

% glibc
LC_TELEPHONE
copy "de_DE"
END LC_TELEPHONE

% glibc
LC_MEASUREMENT
copy "de_DE"
END LC_MEASUREMENT

如果您希望对其他语言环境执行此操作,如es_ES,则需要对其进行以下修改(在我的示例中,我毫不掩饰地从 glibc 复制localedata/locales/es_ES):

  • 将头部的 、 和 (以及其他的 、titlelanguage和)更改为合适的值(例如语言西班牙语、领土西班牙)territorysourcecontactrevisiondate
  • 如果不使用 glibc,你可能需要删除一些带有注释的条目% glibc(例如LC_NAME),但如果您的系统支持它们,则不需要删除(标志-clocaledef应该使其接受这一点,但YMMV)
  • 将所有copy "de_DE"行(有很多行!)更改为copy "es_ES"
  • 更改abday为星期几名称缩写列表(从星期日开始),例如"dom";"lun";"mar";"mi<U00E9>";"jue";"vie";"s<U00E1>b"(在这里您还可以使用 2 个字母或 3 个字母的缩写来满足您的喜好)
  • 更改day为完整的星期名称列表,例如"domingo";"lunes";"martes";"mi<U00E9>rcoles";"jueves";"viernes";"s<U00E1>bado"
  • 更改abmonmon缩写及完整月份名称("ene";"feb";…"enero";"febrero";…
  • 另存为es_ES@iso8601
  • 适当修改开头附近的注释,编译命令现在是sudo localedef -i es_ES@iso8601 -f UTF-8 -c es_ES.UTF-8@iso8601

然后,您可以导出LC_TIME=es_ES.UTF-8@iso8601以使用它。或者,如果您没有超级用户权限,您可以使用LOCPATH(或MUSL_LOCPATH) 在本地安装语言环境数据;对于 glibc,这看起来如下:

mkdir -p ~/.local/locpath
localedef -i es_ES@iso8601 -f UTF-8 -c ~/.local/locpath/es_ES.UTF-8@iso8601

然后,导出LOCPATH=$HOME/.local/locpathLC_TIME=es_ES.UTF-8@iso8601使用。

对于其他语言、国家、编码等请相应进行。

理论上,您也可以设置LC_ALL它,因为它会从所选语言环境的相应主文件中复制剩余的语言环境类别定义。

相关内容