如何格式化日期以便在 Shell 脚本中显示或使用
您需要使用标准 date 命令来格式化 Linux 或 Unix shell 脚本中的日期或时间。您可以在 shell 脚本中使用相同的命令。本页介绍如何在基于 Linux 或 Unix 的系统中格式化日期。
教程详细信息 | |
---|---|
难度等级 | 简单的 |
Root 权限 | 不 |
要求 | date 命令 |
类别 | 命令 |
操作系统兼容性 | FreeBSD • Linux • macOS • NetBSD • OpenBSD • Unix • WSL |
预计阅读时间 | 8 分钟 |
Linux 语法用于格式化屏幕上显示的日期
GNU/date 和 BSD/date 命令的语法如下:
带有前导加号 ( ) 的操作数表示用户定义的格式字符串,该字符串指定显示日期和时间的格式。以下示例在 GNU/Linux、Apple OS X Unix 和 FreeBSD unix 操作系统上进行了测试。
$ date +FORMAT
$ date +"%FORMAT"
$ date +"%FORMAT%FORMAT"
$ date +"%FORMAT-%FORMAT"
$ date -d "DATE STRING" +"%FORMAT"
$ TZ="TIMEZONE" date -d "DATE STRING" +"%FORMAT"
+
任务:以 mm-dd-yy 格式显示日期
打开终端并输入以下日期命令:
$ date +"%m-%d-%y"
示例输出:
02-27-07
要打开 4 位数字年份显示:
$ date +"%m-%d-%Y"
只需将日期显示为 mm/dd/yy 格式:
$ date +"%D"
任务:仅显示时间
键入以下命令:
$ date +"%T"
示例输出:
19:55:04
要显示区域设置的 12 小时制时钟时间,请输入:
$ date +"%r"
示例输出:
07:56:05 PM
要以 HH:MM 格式显示时间,请输入:
$ date +"%H-%M"
示例输出:
00-50
如何将时间/日期格式保存到 shell 变量?
只需在 shell 提示符下键入以下命令即可获取 MM-DD-YYYY 格式的当前日期:
$ NOW=$(date +"%m-%d-%Y")
要显示变量,请使用以下简单命令在 Linux 和 UNIX 下使用 printf 命令/echo 命令在屏幕上输出:
$ echo "$NOW"
$ printf "%s\n" $NOW
示例 shell 脚本
#!/bin/bash NOW="$(date +"%m-%d-%Y")" FILE="backup.$NOW.tar.gz" echo "Backing up data to /nas42/backup.$NOW.tar.gz file, please wait..." # rest of the script ... # tar xcvf /nas42/backup.$NOW.tar.gz /home/ /etc/ /var #... #..
GNU/date 命令支持的 FORMAT 控制字符的完整列表
它可以是下列任意一种的组合:
%格式字符串 | 描述 |
---|---|
%% | 文字 % |
%一个 | 本地的星期几缩写名称(例如,Sun) |
%一个 | 本地星期几的完整名称(例如,星期日) |
%b | 区域设置的月份缩写名称(例如 Jan) |
%B | 语言环境的完整月份名称(例如 January) |
%c | 区域设置的日期和时间(例如,Thu Mar 3 23:05:25 2005) |
%C | 世纪;类似 %Y,但省略最后两位数字(例如 21) |
%日 | 月份中的日期(例如 01) |
%D | 日期;与 %m/%d/%y 相同 |
%e | 月份中的日期,以空格填充;与 %_d 相同 |
%F | 完整日期;与 %Y-%m-%d 相同 |
%克 | ISO 周数的年份的最后两位数字(参见 %G) |
%G | ISO 周数的年份(参见 %V);通常仅与 %V 一起使用 |
%小时 | 与 %b 相同 |
%氢 | 小时(00..23) |
%我 | 小时(01..12) |
%j | 一年中的某一天(001..366) |
%千 | 小时 ( 0..23) |
%升 | 小时 ( 1..12) |
%米 | 月 (01..12) |
%M | 分钟(00..59) |
%n | 换行符 |
%N | 纳秒(000000000..999999999) |
%p | 相当于 AM 或 PM 的区域设置;如果未知则留空 |
%P | 类似 %p,但小写 |
%r | 本地的 12 小时制时间(例如,晚上 11:11:04) |
%R | 24 小时制小时和分钟;与 %H:%M 相同 |
%s | 自 1970-01-01 00:00:00 UTC 以来的秒数 |
%S | 秒 (00..60) |
%吨 | 标签 |
%吨 | 时间;与 %H:%M:%S 相同 |
%u | 星期几 (1..7);1 表示星期一 |
%U | 一年中的周数,以星期日为第一天 (00..53) |
%体积 | ISO 周数,以星期一为第一天 (01..53) |
%重量 | 星期几(0..6);0 表示星期日 |
%重量 | 一年中的周数,星期一为第一天 (00..53) |
%x | 区域设置的日期表示(例如,12/31/99) |
%X | 区域设置的时间表示(例如 23:13:48) |
%年 | 年份的最后两位数字(00..99) |
%Y | 年 |
%z | +hhmm 数字时区(例如,-0400) |
%:z | +hh:mm 数字时区(例如-04 :00) |
%::z | +hh:mm:ss 数字时区(例如,-04:00:00) |
%:::z | 数字时区,带 : 以达到必要的精度(例如-04、+05:30) |
%Z | 字母时区缩写(例如 EDT) |
BSD/date 命令支持的 FORMAT 控制字符完整列表
以下内容适用于 Apple macOS/OS X、FreeBSD 和 *BSD 版本的date 命令:
%格式字符串 | 描述 |
---|---|
%一个 | 将被全国性的完整星期名称表示所取代。 |
%一个 | 将被全国性代表的星期名称缩写所取代。 |
%B | 将被国家代表的月份全名所取代。 |
%b | 被国家代表的月份名称缩写所取代。 |
%C | 被替换为十进制数(年份/100);个位数前面加零。 |
%c | 被国家表示的时间和日期所取代。 |
%D | 相当于“%m/%d/%y”。 |
%日 | 用十进制数 (01-31) 表示的月份日期替换。 |
%E* %O* | POSIX 区域扩展。序列 %Ec %EC %Ex %EX %Ey %EY %Od %Oe %OH %OI %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy 应该提供替代表示。 此外,还实现了 %OB 来表示替代月份名称(独立使用,不提及日期)。 |
%e | 用十进制数 (1-31) 表示的月份日期替换;个位数前面有空格。 |
%G | 用带世纪的十进制数表示的年份来代替。这一年是包含一周大部分时间的年份(星期一是一周的第一天)。 |
%克 | 被替换为与“%G”中相同的年份,但是为没有世纪的十进制数(00-99)。 |
%氢 | 被替换为十进制数 (00-23) 的小时 (24 小时制)。 |
%小时 | 与 %b 相同。 |
%我 | 被替换为十进制数 (01-12) 的小时 (12 小时制)。 |
%j | 用十进制数 (001-366) 表示的一年中的某一天替换。 |
%千 | 用十进制数 (0-23) 替换小时(24 小时制);个位数前面有空格。 |
%升 | 用十进制数 (1-12) 代替小时 (12 小时制);个位数前面有空格。 |
%M | 用十进制数 (00-59) 表示的分钟替换。 |
%米 | 用十进制数 (01-12) 表示的月份替换。 |
%n | 被换行符替换。 |
%O* | 与 %E* 相同。 |
%p | 视情况而定,由“ante meridiem”(上午)或“post meridiem”(下午)的国家表示法取代。 |
%R | 相当于“%H:%M”。 |
%r | 相当于“%I:%M:%S %p”。 |
%S | 被十进制数 (00-60) 中的秒数替换。 |
%s | 替换为自纪元 UTC 以来的秒数(参见 mktime(3))。 |
%吨 | 相当于“%H:%M:%S”。 |
%吨 | 被制表符取代。 |
%U | 替换为一年中的周数(星期日作为一周的第一天),以十进制数(00-53)表示。 |
%u | 用十进制数 (1-7) 替换星期几(星期一为一周的第一天)。 |
%体积 | 用十进制数(01-53)替换一年中的周数(星期一为一周的第一天)。如果包含 1 月 1 日的那周在新的一年中有四天或以上,则为第 1 周;否则为上一年的最后一周,下一周为第 1 周。 |
%v | 相当于“%e-%b-%Y”。 |
%重量 | 替换为一年中的周数(星期一作为一周的第一天),以十进制数(00-53)表示。 |
%重量 | 用十进制数 (0-6) 替换星期几(星期日为一周的第一天)。 |
%X | 被当时的国家代表所取代。 |
%x | 被该日期的国家代表所取代。 |
%Y | 被十进制数形式的年份和世纪所替换。 |
%年 | 用十进制数 (00-99) 表示的不带世纪的年份替换。 |
%Z | 被时区名称替换。 |
%z | 被相对于 UTC 的时区偏移量所取代;前导加号代表 UTC 以东,减号代表 UTC 以西,小时和分钟各跟两位数字,并且它们之间没有分隔符(RFC 822 日期标头的常见形式)。 |
%+ | 被日期和时间的国家表示形式所取代(格式类似于 date(1) 生成的格式)。 |
%-* | GNU libc 扩展。执行数值输出时不做任何填充。 |
%_* | GNU libc 扩展。明确指定填充空间。 |
%0* | GNU libc 扩展。明确指定零作为填充。 |
%% | 被 % 取代。 |
约会示例
我在 macOS/OS X 和 FreeBSD 上运行命令:
date date +"%T" date +"%D" date +"%m-%d-Y" date "+%Y%m%d%H%M.%S"
图 01:date 命令实际作用
格式化给定日期
假设您想将“1978 年 4 月 23 日”打印为 dd/mm/yyyy:
$ date -d "April 23, 1978" +"%d/%m/%Y"
以下是 macOS 或 BSD/date 命令的语法,用于将“1978 年 4 月 23 日”打印为 dd/mm/yyyy:
让我们以 EDT 时区的 YYYY/mm/dd 格式打印以下日期:
shell变量确定写入时间和日期的时区。例如:
在 Linux 上,您可以使用 ls 命令或 tzselect 命令列出所有时区。例如:
$ date -j -f "%INPUT_FORMAT" date_string +"%OUTPUT_FORMAT"
$ date -j -f "%Y%m%d" 19780423 +"%d/%m/%Y"
$ TZ="EDT" date -d "April 23, 2078 5:15:10 PM EDT" +"%Y/%m/%d"
TZ
$ TZ='TIMZ_ZONE_HERE'
$ TZ='TIMZ_ZONE_HERE' date ...
$ TZ="IST" date # Indian Standard Time
$ TZ="EST" date # Eastern Time (ET)
$ TZ='Australia/Melbourne' date # AEDT
$ ls /usr/share/zoneinfo/
Africa Arctic Australia CET Cuba Eire Etc GB GMT+0 Greenwich Iceland iso3166.tab Japan leap-seconds.list MET MST7MDT NZ-CHAT Portugal PRC ROC SystemV UCT UTC zone1970.tab America Asia Brazil Chile EET EST Europe GB-Eire GMT-0 Hongkong Indian Israel Kwajalein Libya Mexico Navajo Pacific posix PST8PDT ROK Turkey Universal WET zone.tab Antarctica Atlantic Canada CST6CDT Egypt EST5EDT Factory GMT GMT0 HST Iran Jamaica leapseconds localtime MST NZ Poland posixrules right Singapore tzdata.zi US W-SU Zulu
--debug在 GNU/date 上传递
我们可以注释解析的日期,并警告屏幕上可疑的使用情况。例如:
$ date --debug -d "April 23, 1978" +"%d/%m/%Y"
输出:
date: parsed date part: (Y-M-D) 1978-04-23 date: input timezone: system default date: warning: using midnight as starting time: 00:00:00 date: starting date/time: '(Y-M-D) 1978-04-23 00:00:00' date: '(Y-M-D) 1978-04-23 00:00:00' = 262117800 epoch-seconds date: timezone: system default date: final: 262117800.000000000 (epoch-seconds) date: final: (Y-M-D) 1978-04-22 18:30:00 (UTC) date: final: (Y-M-D) 1978-04-23 00:00:00 (UTC+05:30) 23/04/1978
如何永久设置 TZ
假设您希望将 TZ shell 变量设置为 Africa/Algiers 时区,那么您可以通过将以下行附加到 .profile 或 ~/.bash_profile 文件来使此更改永久生效。在您的主目录中,然后注销并再次登录。例如:
TZ='Africa/Algiers'; export TZ
结论
本页介绍了如何在 Linux 和类 Unix 系统上格式化日期。有关更多信息,请使用 man 命令或 help 命令查看以下页面:
推荐阅读:
$ man date
$ man bash
$ man ksh
$ man tcsh
- Shell 脚本:创建文件名中包含日期的报告/日志文件名
- GNU/Linux 日期手册页在此处,FreeBSD/macOS 日期手册页在此处。