目录
要打印一个没有前导零的日期,您可以使用(GNU扩展)' - '标志来完全抑制填充:
在设置系统时钟时,以许多非gnu版本的date所需的格式打印当前日期和时间:
如果未在date字符串中指定时区信息,则date在解释字符串时使用计算机的时区概念。
内容来源:
GUN : Coreutils - GNU core utilities
busybox v1.36.1 : 【busybox记录】【shell指令】基于的Busybox的版本和下载方式-CSDN博客
【GUN】【date】指令介绍
date:打印或设置系统日期和时间
简介:
date [option]... [+format]
date [-u|--utc|--universal] [ MMDDhhmm[[CC]YY][.ss] ]
date 命令用来显示日期和时间。使用 --set (-s)选项,或使用 ‘MMDDhhmm[[CC]YY][.ss]’ 设置日期和时间。
调用不带格式参数的date等同于使用依赖于LC_TIME区域设置类别的默认格式调用date。
在默认的C语言环境中,此格式为 ‘'+%a %b %e %H:%M:%S %Z %Y'’ ,因此输出看起来像‘Thu Jul 9 17:00:00 EDT 2020’.
通常情况下,date使用TZ环境变量指定的时区规则,如果没有设置TZ,则使用系统默认规则。参见GNU C库参考手册中的“用TZ指定时区”一节。
退出状态为0表示成功,非0表示失败。
1 指定日期输出格式
如果给定一个以' + '开头的参数,date将以该参数定义的格式打印当前日期和时间(或由 --date选项指定的日期和时间,见下文),这与strftime函数的格式类似。
除了以' % '开头的转换说明符外,格式字符串中的字符将被原样打印。下面描述了转换说明符。
1.1 时间转换说明符
与时间相关的日期转换说明符。
‘%H’ 小时(' 00 '…' 23 ')
‘%I’ 小时(' 01 '…' 12 ')
‘%k’ 小时,空格填充(' 0 '…' 23 ');相当于‘%_H’。这是一个GNU扩展。
‘%l’ 小时,空格填充(' 1 '…' 12 ');相当于‘%_I’。这是一个GNU扩展。
‘%M’ 分钟(' 00 '…' 59 ')
‘%N’ 纳秒(' 000000000 '…' 999999999 ')。这是一个GNU扩展。
‘%p’ 区域设置相当于' AM '或' PM ';在许多地方空白。中午被当作“PM”,午夜被当作“AM”。
‘%P’ 类似‘%p’,只是小写。这是一个GNU扩展。
‘%r’ 区域设置的12小时时钟时间(例如,' 11:11:04 PM ')
‘%R’ 24小时,小时和分钟。与 ‘%H:%M’ 相同。
‘%s’ 从 Epoch 开始的秒数,即从UTC时间1970-01-01 00:00开始。除非支持闰秒,否则不计算闰秒。参见[%s-examples],第202页的示例。这是一个GNU扩展。
‘%S’ 秒(' 00 '…' 60 ')。如果支持闰秒,这个值可能是' 60 '。
‘%T’ 24小时,小时、分、秒。与 ‘%H:%M:%S’ 相同。
‘%X’ 区域设置的时间表示(例如,' 23:13:48 ')
‘%z’ 四位数字时区,例如' -0600 '或' +0530 ',如果无法确定时区,则为' -0000 '。该值使用TZ环境变量指定的时区规则,反映适合当前时间的数字时区。
如果时区的数字偏移量为零并且其缩写以' - '开头,则无法确定时区。时间(以及可选的时区规则)可以被 --date选项覆盖。
‘%:z’ 带‘:’的数字时区,例如' -06:00 '或' +05:30 '),如果无法确定时区,则使用' -00:00 '。这是一个GNU扩展。
‘%::z’ 使用‘:’(例如,' -06:00:00 '或' +05:30:00 ')的数字时区到最近的秒,如果无法确定时区,则使用' -00:00:00 '。这是一个GNU扩展。
‘%:::z’ 带有‘:’的数字时区,使用最低必要精度(例如,' -06 ',' +05:30 '或' -04:56:02 '),如果无法确定时区,则使用' -00 '。这是一个GNU扩展。
‘%Z’ 按字母顺序排列的时区缩写(例如,‘EDT’),如果无法确定时区,则不显示。请参阅%z’了解如何确定它。
1.2 日期转换说明符
与日期相关的日期转换说明符。
‘%a’ 区域设置的工作日缩写名(例如,“Sun”)
‘%A’ 域设置的完整工作日名称,可变长度(例如,' Sunday ')
‘%b’ 域设置的缩写月名(例如,' Jan ')
‘%B’ 域设置的完整月份名称,可变长度(例如,' January ')
‘%c’ 域设置的日期和时间(例如,‘Thu Mar 3 23:05:25 2020’)
‘%C’ 世纪。这类似于‘%Y’,只是省略了最后两位数字。例如,如果‘%Y’为“2019”,则为“20”;如果‘%Y’为“-001”,则为“-0”。通常至少有两个字符,但也可能更多。
‘%d’ 月中的第几天(例如' 01 ')
‘%D’ 日期;与‘%m/%d/%y’相同
‘%e’ 月份的日期,空格填充;与‘%_d’相同
‘%F’ ISO 8601 格式的“%F”完整日期;类似于‘%+4Y-%m-%d’,除了任何标志或字段宽度覆盖' + '和(减去6后)' 4 '。
对于日期格式来说,这是一个很好的选择,因为它是标准的,并且在年份在0000范围内的通常情况下易于排序9999.
‘%g’ 年对应于ISO周数,但不包含世纪(范围' 00 '到' 99 ')。它具有与‘%Y’相同的格式和值,除了如果ISO周数(参见‘%V’)属于前一年或下一年,则使用该年份。
‘%G’ 与ISO周数对应的“%G”年。它具有与' %Y '相同的格式和值,除了如果ISO周数(参见‘%V’)属于上一年或下一年,则使用该年份。通常只有在也使用‘%V’时才有用;
例如,格式‘%G-%m-%d’可能是错误的,因为它将ISO周数年与传统的月和日结合在一起。
‘%h’ 与‘%b’相同
‘%j’ 年月日(' 001 '…' 366 ')
‘%m’ 月(' 01 '…' 12 ')
‘%q’ 季度(' 1 '…' 4 ')
‘%u’ 星期几(' 1 ' . . ' 7 '),其中' 1 '对应星期一
‘%U’ 一年中的周数,星期日作为一周的第一天(“00”…“53”)。新年中第一个星期天之前的日子属于第0周。
‘%V’ ISO周数,即一年中的周数,星期一为一周的第一天(' 01 '…' 53 ')。如果包含1月1日的一周在新的一年中有四天或更多天,则将其视为第一周;
否则为前一年第53周,下一周为第1周。(参见ISO 8601标准。)
‘%w’ 星期几(' 0 ' . . ' 6 '),其中0对应星期日
‘%W’ 年的周数,星期一作为一周的第一天(' 00 '…' 53 ')。新年中第一个星期一之前的日子属于第0周。
‘%x’ 区域设置的日期表示(例如,' 12/31/99 ')
‘%y’ 年份的后两位数字(' 00 '…' 99 ')
‘%Y’ 这通常至少是四个字符,但也可能更多。年份“0000”在年份“0001”之前,年份“-001”在年份“0000”之前。
1.3 文字转换说明符
生成字面值字符串的日期转换说明符。
‘%%’ 是字面量%
‘%n’ 是换行符
‘%t’ 是一个水平制表符
1.4填充和其他标志
除非另有指定,否则date通常用零填充数字字段,因此,例如,数字月份总是作为两位数字输出。大多数数值字段都填充在左侧。
但是,由于纳秒通常在 ‘%s.%-N’ 等格式的小数点之后使用,因此在右侧填充了纳秒。此外,由于Epoch没有自然宽度,因此不会填充秒。
以下可选标志可以出现在‘%’之后:
‘-’ (连字符)不要填充字段;如果输出用于人类消费,则有用。这是一个GNU扩展。
作为一种特殊情况,‘%-N’只输出足够的尾随数字以不丢失信息,假设时间戳的分辨率与当前硬件时钟相同。
例如,如果硬件时钟分辨率为1微秒,则 ‘%s.%-N’ 输出类似‘1640890100.395710’。
‘_’ (下划线)填充空格;如果您需要输出固定数量的字符,则非常有用,但是零太分散注意力了。这是一个GNU扩展。
‘0’ 用零填充,即使转换说明符通常会用空格填充。
‘+’ 键盘上有零,比如' 0 '。此外,如果年份超过9999或字段宽度超过4,则在年份前加“+”;类似地,如果任何世纪数超过99或字段宽度超过2,则在其前面加上' + '。
它支持ISO 8601格式的日期在遥远的未来;例如,命令 date --date=12019-02-25 +%+13F 输出字符串‘+012019-02-25’。
‘^’ 如果可能,请使用大写字符。这是一个GNU扩展。
‘#’ 如果可能的话,使用相反的大小写字符。一个通常是大写的字段变成了小写,反之亦然。这是一个GNU扩展。
下面是一些填充的例子:
date +%d/%m -d "Feb 1"
⇒ 01/02
date +%-d/%-m -d "Feb 1"
⇒ 1/2
date +%_d/%_m -d "Feb 1"
⇒ 1/ 2
您可以选择将字段宽度指定为十进制数(如果存在,则在任何标志之后)。
如果字段输出的自然大小少于指定的字符数,则结果通常被右写,调整并填充到给定的大小。例如,‘%9B’在宽度为9的字段中打印右侧调整后的月份名称。纳秒被左调整,并被截断或填充到字段宽度。
可选修饰符可以遵循可选标志和宽度规范。修饰语是:
‘E’ 使用区域设置的日期和时间的替代表示。此修饰符适用于' %c '、' %c '、' %x '、' %x '、' %y '和' %y '转换说明符。例如,在日本语言环境中,' %Ex '可能产生基于日本皇帝统治的日期格式。
‘O’ 使用区域设置的备用数字符号表示数字。此修饰符仅适用于数字转换说明符。
如果格式支持该修饰符,但没有可用的替代表示,则忽略它。
POSIX仅为' %C ', ' %F ', ' %G '和' %Y '(都没有修饰符)指定标志和字段宽度的行为,并且要求当且仅当字段宽度也存在时才存在标志。标志、字段宽度和修饰符的其他组合是GNU扩展。
2 设置时间
您必须具有适当的权限才能设置系统时钟。要使更改在重新启动时保持不变,可能需要从系统时钟更新硬件时钟,这在系统上可能不会自动发生。
要设置时钟,可以使用 --set (-s)选项(参见第21.1.3节[日期选项],第199页)。
要设置时钟而不使用GNU扩展,您可以给date一个形式为‘MMDDhhmm[[CC]YY][.ss]’,其中每个两个字母组成部分代表两个数字,其含义如下:
MM month
DD day within month
hh hour
mm minute
CC first two digits of year (optional)
YY last two digits of year (optional)
ss second (optional)
--date和 --set选项不能与上述格式的参数一起使用。
--universal选项可以与这样的参数一起使用,以指示指定的日期和时间相对于世界时而不是相对于本地时区。
3 日期选项
程序接受以下选项。请参见第2章[常用选项],第2页。除了-u之外,这些选项都是POSIX的GNU扩展。
指定要显示日期的所有选项都是互斥的。即:--date, --file, --reference, --resolution.
‘-d datestr’
‘--date=datestr’
显示 datestr 中指定的日期和时间,而不是当前日期和时间。Datestr几乎可以是任何通用格式。
它可以包含月份名称、时区、 ‘am’ ‘pm’, ‘yesterday 等。
例如,--date="2020-07-21 14:19:13.489392193 +0530"指定2020年7月21日下午2:19:13 (UTC以东5小时30分钟)后489392193纳秒的瞬间。
日期必须是独立于语言环境的格式。例如,下面的' LC_TIME=C '需要在许多地区打印正确的日期:
date -d "$(LC_TIME=C date)"
参见第29章[日期输入格式],第245页。
‘--debug’
注释已解析的日期,显示有效时区,并警告可能的误用。
‘-f datefile’
‘--file=datefile’
使用 -d 解析datefile中的每一行,并显示结果日期和时间。如果datefile为' - ',则使用标准输入。当您有许多日期需要处理时,这很有用,因为多次启动日期可执行文件的系统开销可能相当大。
‘-I[timespec]’
‘--iso-8601[=timespec]’
使用ISO 8601格式显示日期,‘%Y-%m-%d’。
参数timespec指定要包含的时间附加项的数量。它可以是下列情况之一:
‘auto’ 只打印日期。如果省略timespec,这是默认值。这类似于%Y-%m-%d的格式。
‘hours’ 也可以打印时间和时区。这类似于%Y-%m-%dT%H%:z的格式。
‘minutes’ 也可以打印minutes。这类似于%Y-%m-%dT%H:% m %:z的格式。
‘seconds’ 也可以打印秒。这类似于%Y-%m-%dT%H:% m:%S%:z的格式。
‘ns’ 也 可以打印纳秒。这类似于%Y-%m-%dT%H:% m:%S,%N%:z的格式。
无论当前语言环境如何,这种格式始终适合作为 --date (-d)和 --file (-f)选项的输入。
‘-r file’
‘--reference=file’
显示上次修改文件的日期和时间,而不是当前的日期和时间。
‘--resolution’
显示时间戳分辨率,而不是时间。按日期输出的当前时钟时间戳是时间戳分辨率的整数倍。使用此选项,格式默认为‘%s.%N’。例如,时钟分辨率为1毫秒,输出为:
0.001000000
‘-R’
‘--rfc-email’
使用格式 ‘%a, %d %b %Y %H:%M:%S %z’ 显示日期和时间,在C语言环境中求值,因此缩写始终是英语。例如:
Mon, 09 Jul 2020 17:00:00 -0400
此格式符合Internet rfc 5322 (https://datatracker.ietf.org/doc/rfc5322/)2822 (https://datatracker.ietf.org/doc/rfc2822/)和822 (https://datatracker.ietf.org/doc/rfc822/)是当前和以前的互联网电子邮件标准。
为了与旧版本的date兼容, --rfc-2822和 --rfc-822是 --rfc-email.的别名。
‘--rfc-3339=timespec’
使用Internet RFC 3339 (https://datatracker.ietf.org/doc/rfc3339/)指定的格式显示日期。
这类似于 --iso-8601,只不过是用空格而不是' T '分隔日期和时间,用句号而不是逗号分隔秒和次秒。
无论当前语言环境如何,这种格式始终适合作为 --date (-d)和 --file (-f)选项的输入。参数timespec指定要包含多少时间。它可以是下列情况之一:
‘date’ 只打印完整日期,例如‘2020-07-21’。这类似于格式‘%Y-%m-%d’.
‘seconds’ 打印以空格分隔的完整日期和时间,例如‘2020-07-21 04:30:37+05:30’.
输出以数字时间偏移结束;这里的“+05:30”表示当地时间比UTC晚5小时30分钟。这类似于格式‘%Y-%m-%d %H:%M:%S%:z’
‘ns’ 类似'秒',但也可以打印纳秒,例如‘2020-07-21 04:30:37.998458565+05:30’.
这就像格式的 ‘%Y-%m-%d %H:%M:%S.%N%:z’。
‘-s datestr’
‘--set=datestr’
将日期和时间设置为datestr。参见上面的d。参见第21.1.2节[设置时间],第199页。
‘-u’
‘--utc’
‘--universal’
通过将TZ环境变量设置为字符串' UTC0 '来操作通用时间。
UTC是协调世界时(Coordinated Universal Time)的缩写,成立于1960年。由于历史原因,世界时间通常被称为“格林威治标准时间”(GMT)。
通常情况下,系统忽略闰秒,从而实现近似UTC而不是真正的UTC。
【busybox】【date】指令介绍
[root@localhost bin]# ./date --help
BusyBox v1.36.1 (2024-04-16 11:16:28 EDT) multi-call binary.
Usage: date [OPTIONS] [+FMT] [[-s] TIME]
Display time (using +FMT), or set time
-u Work in UTC (don't convert to local time)
[-s] TIME Set time to TIME
-d TIME Display TIME, not 'now'
-D FMT FMT (strptime format) for -s/-d TIME conversion
-r FILE Display last modification time of FILE
-R Output RFC-2822 date
-I[SPEC] Output ISO-8601 date
SPEC=date (default), hours, minutes, seconds or ns
Recognized TIME formats:
@seconds_since_1970
hh:mm[:ss]
[YYYY.]MM.DD-hh:mm[:ss]
YYYY-MM-DD hh:mm[:ss]
[[[[[YY]YY]MM]DD]hh]mm[.ss]
'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead
【linux】【date】指令介绍
[root@localhost bin]# date --help
用法:date [选项]... [+格式]
或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
Display the current time in the given FORMAT, or set the system date.
必选参数对长短选项同时适用。
-d, --date=STRING display time described by STRING, not 'now'
--debug annotate the parsed date,
and warn about questionable usage to stderr
-f, --file=DATEFILE like --date; once for each line of DATEFILE
-I[FMT], --iso-8601[=FMT] output date/time in ISO 8601 format.
FMT='date' for date only (the default),
'hours', 'minutes', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14T02:34:56-06:00
-R, --rfc-email output date and time in RFC 5322 format.
Example: Mon, 14 Aug 2006 02:34:56 -0600
--rfc-3339=FMT output date/time in RFC 3339 format.
FMT='date', 'seconds', or 'ns'
for date and time to the indicated precision.
Example: 2006-08-14 02:34:56-06:00
-r, --reference=FILE display the last modification time of FILE
-s, --set=STRING set time described by STRING
-u, --utc, --universal print or set Coordinated Universal Time (UTC)
--help 显示此帮助信息并退出
--version 显示版本信息并退出
给定的格式FORMAT 控制着输出,解释序列如下:
%% 一个文字的 %
%a 当前locale 的星期名缩写(例如: 日,代表星期日)
%A 当前locale 的星期名全称 (如:星期日)
%b 当前locale 的月名缩写 (如:一,代表一月)
%B 当前locale 的月名全称 (如:一月)
%c 当前locale 的日期和时间 (如:2005年3月3日 星期四 23:05:25)
%C 世纪;比如 %Y,通常为省略当前年份的后两位数字(例如:20)
%d 按月计的日期(例如:01)
%D 按月计的日期;等于%m/%d/%y
%e 按月计的日期,添加空格,等于%_d
%F 完整日期格式,等价于 %Y-%m-%d
%g ISO-8601 格式年份的最后两位 (参见%G)
%G ISO-8601 格式年份 (参见%V),一般只和 %V 结合使用
%h 等于%b
%H 小时(00-23)
%I 小时(00-12)
%j 按年计的日期(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 1970-01-01 00:00:00 UTC
%S 秒(00-60)
%t 输出制表符 Tab
%T 时间,等于%H:%M:%S
%u 星期,1 代表星期一
%U 一年中的第几周,以周日为每星期第一天(00-53)
%V ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)
%w 一星期中的第几日(0-6),0 代表周一
%W 一年中的第几周,以周一为每星期第一天(00-53)
%x 当前locale 下的日期描述 (如:12/31/99)
%X 当前locale 下的时间描述 (如:23:13:48)
%y 年份最后两位数位 (00-99)
%Y 年份
%z +hhmm 数字时区(例如,-0400)
%:z +hh:mm 数字时区(例如,-04:00)
%::z +hh:mm:ss 数字时区(例如,-04:00:00)
%:::z 数字时区带有必要的精度 (例如,-04,+05:30)
%Z 按字母表排序的时区缩写 (例如,EDT)
默认情况下,日期的数字区域以0 填充。
The following optional flags may follow '%':
- (hyphen) do not pad the field
_ (underscore) pad with spaces
0 (zero) pad with zeros
^ use upper case if possible
# use opposite case if possible
在任何标记之后还允许一个可选的域宽度指定,它是一个十进制数字。
作为一个可选的修饰声明,它可以是E,在可能的情况下使用本地环境关联的
表示方式;或者是O,在可能的情况下使用本地环境关联的数字符号。
Examples:
Convert seconds since the epoch (1970-01-01 UTC) to a date
$ date --date='@2147483647'
Show the time on the west coast of the US (use tzselect(1) to find TZ)
$ TZ='America/Los_Angeles' date
Show the local time for 9AM next Friday on the west coast of the US
$ date --date='TZ="America/Los_Angeles" 09:00 next Fri'
GNU coreutils 在线帮助:<https://www.gnu.org/software/coreutils/>
请向 <http://translationproject.org/team/zh_CN.html> 报告 date 的翻译错误
完整文档请见:<https://www.gnu.org/software/coreutils/date>
或者在本地使用:info '(coreutils) date invocation'
使用示例:
打印前天的日期:
date --date='2 days ago'
打印三个月零一天后的日期:
date --date='3 months 1 day'
打印当年圣诞节的年数:
date --date='25 Dec' +%j
打印当前的全月名称和月的日期:
date '+%B %d'
但这可能不是您想要的,因为对于一个月的前九天,‘%d’扩展为一个填零的两位数字段,例如‘date -d 1may '+%B %d'’将打印‘May 01’。
要打印一个没有前导零的日期,您可以使用(GNU扩展)' - '标志来完全抑制填充:
date -d 1may '+%B %-d'
在设置系统时钟时,以许多非gnu版本的date所需的格式打印当前日期和时间:
date +%m%d%H%M%Y.%S
将系统时钟拨快两分钟:
date --set='+2 minutes'
要以Internet RFC 5322格式打印日期,
date --rfc-email
输出:
Tue, 09 Jul 2020 19:00:37 -0400
要将日期字符串转换为自Epoch (1970-01-01 00:00 UTC)以来的秒数,使用带‘%s’格式的 --date选项。
这在按日期排序和/或绘图和/或比较数据时很有用。
下面的命令输出纪元后两分钟从Epoch到现在的秒数:
date --date='1970-01-01 00:02:00 +0000' +%s
120
要将日期字符串从一个时区转换为另一个时区,请在环境中指定‘TZ="from"’,并在——date选项中指定‘TZ="to"’
TZ="Asia/Tokyo" date --date='TZ="America/New_York" 2023-05-07 12:23'
Mon May 8 01:23:00 JST 2023
如果未在date字符串中指定时区信息,则date在解释字符串时使用计算机的时区概念。
例如,如果你的计算机的时区是马萨诸塞州的剑桥,它当时比UTC晚5小时(即18000秒):
# local time zone used
date --date='1970-01-01 00:02:00' +%s
18120
如果您正在排序或绘图日期数据,您的原始日期值可能表示为自Epoch以来的秒。但很少有人会看到日期“1577836800”,然后漫不经心地说:“哦,这是英国格林威治2020年的第一秒。”
date --date='2020-01-01 UTC' +%s
1577836800
另一种选择是使用 --utc (-u)选项。然后你可以从日期字符串中省略' UTC '。虽然这对' %s '和许多其他格式序列产生相同的结果,但时区偏移量不同于零,但对于' %z '等依赖于区域的格式会产生不同的结果。
date -u --date=2020-07-21 +%s
1595289600
要将如此庞大的秒数转换为更易读的形式,可以使用如下命令:
date -d @1595289600 +"%F %T %z"
2020-07-20 20:00:00 -0400
通常输出相对于utc的日期和时间会更好:
date -u -d @1595289600 +"%F %T %z"
2020-07-21 00:00:00 +0000
通常秒数会忽略闰秒,但有些系统是例外。
因为闰秒是不可预测的,所以在计数中包含闰秒的非典型系统上,秒计数和未来时间戳之间的映射是不可靠的。
以下是两种系统如何处理2016年底的闰秒:
#典型的系统忽略闰秒:
date --date='2016-12-31 23:59:59 +0000' +%s
1483228799
date --date='2016-12-31 23:59:60 +0000' +%s
date:无效日期'2016-12-31 23:59:60 +0000'
date --date='2017-01-01 00:00:00 +0000' +%s
1483228800
#非典型系统计算闰秒:
date --date='2016-12-31 23:59:59 +0000' +%s
1483228825
date --date='2016-12-31 23:59:60 +0000' +%s
1483228826
date --date='2017-01-01 00:00:00 +0000' +%s
1483228827
常用组合指令:
NA