如何格式化日期以显示或者在Shell脚本中使用

时间:2020-01-09 10:42:15  来源:igfitidea点击:

如何根据我在Linux或者Unix之类的操作系统上的要求,格式化要在shell脚本屏幕上显示的日期?
您需要使用标准date命令在Linux或者Unix shell脚本中格式化日期或者时间。
您可以对shell脚本使用相同的命令。
本教程显示如何在Linux或者基于Unix的系统中格式化日期。

Linux语法格式化日期以在屏幕上显示

GNU/date和BSD/date命令的语法如下:

date +FORMAT
date +"%FORMAT"
date +"%FORMAT%FORMAT"
date +"%FORMAT-%FORMAT"

带前导加号(+)的操作数表示用户定义的格式字符串,该字符串指定显示日期和时间的格式。
以下示例在GNU/Linux,Apple OS X Unix和FreeBSD Unix操作系统上进行了测试。

以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提示符下执行以下命令:

$ NOW=$(date +"%m-%d-%Y")

要显示变量,请使用echo/printf命令:

$ echo $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 script
# tar xcvf /nas42/backup.$NOW.tar.gz /home/ /etc/ /var

GNU/date命令支持的FORMAT控制字符的完整列表

FORMAT控制输出。
它可以是以下任意一项的组合:

%FORMAT字符串描述
%%文字%
%a语言环境缩写的星期几名称(例如,Sun)
%A语言环境完整的工作日名称(例如,星期日)
%b语言环境缩写的月份名称(例如Jan)
%B语言环境完整月份名称(例如,一月)
%c语言环境日期和时间(例如2005年3月3日星期四,23:05:25)
%C世纪;类似于%Y,但省略了后两位数字(例如21)
%d每月的某天(例如01)
%D日期;与%m /%d /%y相同
%e每月的某天,空格已填充;与%_d
%F完整日期;与%Y-%m-%d
%gISO周号的年份的后两位数字(请参见%G)
%GISO周编号的年份(请参见%V);通常仅对%V
%h与%b相同
%H小时(00..23)
%I小时(01..12)
%j一年中的哪一天(001..366)
%k小时(0..23)
%l小时(1..12)
%m月(01..12)
%M分钟(00..59)
%n换行符
%N纳秒(000000000..999999999)
%p相当于AM或者PM的语言环境;如果未知,则为空白
%P类似于%p,但小写
%r区域设置12小时制(例如11:11:04 PM)
%R24小时小时和分钟;与%H:%M
%s秒,自1970-01-01 00:00:00 UTC
%S秒(00..60)
%t标签
%T时间;与%H:%M:%S
%u星期几(1..7); 1是星期一
%U年的周数,以星期日为一周的第一天(00..53)
%VISO周数,以星期一为一周的第一天(01..53)
%w星期几(0..6); 0是星期日
%W年的周数,以星期一为一周的第一天(00..53)
%x语言环境日期表示形式(例如,12/31/99)
%X语言环境时间表示形式(例如23:13:48)
%y年份的后两位(00..99)
%Y
%z+ hhmm数字时区(例如<B> -0400)
%:z+ hh:mm数字时区(例如<B> -04:00)
%:: z+ hh:mm:ss数字时区(例如<B> -04:00:00)
%::: z数字时区,带有:达到必要的精度(例如<B> -04,+ 05:30)
%Z字母时区缩写(例如EDT)

BSD/date命令支持的FORMAT控制字符的完整列表

以下命令适用于Apple OS X,FreeBSD和BSD版本的date命令:

%A被完整的工作日名称的国家表示代替。
%a被缩写的工作日名称的国家/地区表示代替。
%B被替换为完整月份名称的国家/地区代表。
%b被缩写的月份名称的国家表示代替。
%C替换为(年/100)作为十进制数;单个数字后跟零。
%c被时间和日期的国家表示代替。
%D等于%m /%d /%y。
%d被替换为十进制数字(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被替换为与%G中相同的年份,但替换为不带世纪的十进制数字(00-99)。
%H被小时(24小时制)替换为十进制数字(00-23)。
%h与%b相同。
%I被小时(12小时制)替换为十进制数字(01-12)。
%j被替换为十进制数字(001-366)。
%k被小时(24小时制)替换为十进制数字(0-23);单个数字后跟一个空格。
%l被小时(12小时制)替换为十进制数字(1-12);单个数字后跟一个空格。
%M被分钟替换为十进制数字(00-59)。
%m被替换为月份的十进制数字(01-12)。
%n换行。
%O*与%E*相同。
%p
%R等效于%H:%M。
%r等效于%I:%M:%S%p。
%S被第二个十进制数字(00-60)取代。
%s替换为自世界协调时间(UTC)以来的秒数(请参阅mktime(3))。
%T等于%H:%M:%S。
%t被制表符代替。
%U被替换为一年中的星期数(星期日为一周的第一天)作为十进制数(00-53)。
%u被替换为工作日(星期一为一周的第一天)作为十进制数字(1-7)。
%V替换为年份的星期数(星期一为星期的第一天),以十进制数(01-53)表示。如果包含1月1日的一周在新年中有四天或者更多天,则为第一周;否则,它是上一年的最后一周,而下周是第1周。
%v等同于%e-%b-%Y。
%W被替换为年份的星期数(星期一作为星期的第一天)作为十进制数(00-53)。
%w被替换为工作日(星期日为一周的第一天)作为十进制数字(0-6)。
%X被时间的国家表示代替。
%x被日期的国家表示代替。
%Y替换为以世纪作为十进制数字的年份。
%y被不带世纪的年份替换为十进制数字(00-99)。
%Z被时区名称替换。
%z被从UTC偏移的时区替换;
%+替换为日期和时间的国家表示形式(格式类似于date(1)生成的格式)。
%-*GNU libc扩展。在执行数字输出时,请勿进行任何填充。
%_*GNU libc扩展。明确指定用于填充的空间。
%0*GNU libc扩展。显式指定填充零。
%%被%代替。