From b2b841bc8709fcf82cfaa9cff5ea45c1d29fa3ab Mon Sep 17 00:00:00 2001 From: ZhuangZhu-74 <49544524+ZhuangZhu-74@users.noreply.github.com> Date: Tue, 10 Sep 2019 16:43:17 +0800 Subject: [PATCH] Update date.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按照外部命令的格式(chmod.md)更新了文档格式及内容。 --- command/date.md | 223 ++++++++++++++++++++++++++---------------------- 1 file changed, 119 insertions(+), 104 deletions(-) diff --git a/command/date.md b/command/date.md index 53390f477d..acf8dde71e 100644 --- a/command/date.md +++ b/command/date.md @@ -3,168 +3,183 @@ date 显示或设置系统时间与日期 -## 补充说明 - -**date命令** 是显示或设置系统时间与日期。 - -很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。 - -### 语法 +## 概要 ```shell -date(选项)(参数) +date [OPTION]... [+FORMAT] +date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] ``` -### 选项 +## 主要用途 + +- 转换时间到选定的格式,默认为当前。 +- 设置系统时间。 + +## 参数 + +format:输出的时间格式。 ```shell --d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; --s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; --u:显示GMT; ---help:在线帮助; ---version:显示版本信息。 +format可用的转义序列如下: + +%% 百分号 +%a 当地缩写的工作日名称(例如,Sun) +%A 当地完整的工作日名称(例如,Sunday) +%b 当地缩写的月份名称(例如,Jan) +%B 当地完整的月份名称(例如,January) +%c 当地的日期和时间(例如,Thu Mar 3 23:05:25 2005) +%C 世纪,和%Y类似,但是省略后两位(例如,20) +%d 一月中的一天(例如,01) +%D 日期,等价于%m/%d/%y +%e 一月中的一天,格式使用空格填充,等价于%_d +%F 完整的日期;等价于%+4Y-%m-%d +%g ISO标准计数周的年份的最后两位数字 +%G ISO标准计数周的年份,通常只对%V有用 +%h 等价于%b +%H 小时,范围(00..23) +%I 小时,范围(00..23) +%j 一年中的一天,范围(001..366) +%k 小时,使用空格填充,范围(0..23),等价于%_H +%l 小时,使用空格填充,范围(1..12),等价于%_I +%m 月,范围(01..12) +%M 分钟,范围(00..59) +%n 换行符 +%N 纳秒,范围(000000000..000000000) +%p 用于表示当地的AM或PM,如果未知则为空白 +%P 类似于%p,但用小写表示 +%q 季度,范围(1..4) +%r 当地以12小时表示的时钟时间(例如,11:11:04 PM) +%R 24小时每分钟;等价于%H:%M +%s 自协调世界时1970年01月01日00时00分以来的秒数 +%S 秒数,范围(00..60) +%t 水平制表符 +%T 时间;等价于%H:%M:%S +%u 一周中的一天(1..7),1代表星期一 +%U 一年中的第几周,周日作为一周的起始(00..53) +%V ISO标准计数周,该方法将周一作为一周的起始(01..53) +%w 一周中的一天(0..6),0代表星期天 +%W 一年中的第几周,周一作为一周的起始(00..53) +%x 当地的日期表示(例如,12/31/99) +%X 当地的时间表示(例如,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 (数字0) 使用数字0填充相应的字段。 ++ 用数字0填充,未来年份大于4位数字则在前面加上'+'号。 +^ 允许的情况下使用大写。 +# 允许的情况下将默认的大写转换为小写,默认的小写转换为大写。 + +在任何标志之后都有一个可选的字段宽度,如小数;然后是一个可选的修饰符,在可用的情况下,使用E来使用当地语言环境的替代表示, +使用O来使用当地语言环境的替代数字符号。 ``` -### 参数 - -<+时间日期格式>:指定显示时使用的日期时间格式。 - -### 日期格式字符串列表 +## 选项 ```shell -%H # 小时,24小时制(00~23) -%I # 小时,12小时制(01~12) -%k # 小时,24小时制(0~23) -%l # 小时,12小时制(1~12) -%M # 分(00~59) -%p # 显示出上午或下午 -%r # 时间,12小时制 -%s # 从1970年1月1日0点到目前经历的秒数 -%S # 秒(00~59) -%T # 时间(24小时制)(hh:mm:ss) -%X # 显示时间的格式(%H时%M分%S秒) -%Z # 按字母表排序的时区缩写 -%a # 星期名缩写 -%A # 星期名全称 -%b # 月名缩写 -%B # 月名全称 -%c # 日期和时间 -%d # 按月计的日期(01~31) -%D # 日期(mm/dd/yy) -%h # 和%b选项相同 -%j # 一年的第几天(001~366) -%m # 月份(01~12) -%w # 一个星期的第几天(0代表星期天) -%W # 一年的第几个星期(00~53,星期一为第一天) -%x # 显示日期的格式(mm/dd/yy) -%y # 年份的最后两个数字(1999则是99) -%Y # 年份(比如1970、1996等) -%C # 世纪,通常为省略当前年份的后两位数字 -%U # 一年中的第几周,以周日为每星期第一天 -%e # 按月计的日期,添加空格,等于%_d +长选项与短选项等价 + +-d, --date=STRING 解析字符串并按照指定格式输出,字符串不能是'now'。 +--debug 注释已解析的日期,并将有疑问的用法发送到标准错误。 +-f, --file=DATEFILE 类似于--date; 一次从DATEFILE处理一行。 +-I[FMT], --iso-8601[=FMT] 按照ISO 8601格式输出,FMT可以为'date'(默认),'hours','minutes','seconds','ns'。 + 例如:2006-08-14T02:34:56-06:00 +-R, --rfc-email 按照RFC 5322格式输出,例如: Mon, 14 Aug 2006 02:34:56 -0600 +--rfc-3339=FMT 按照RFC 3339格式输出,FMT可以为'date', 'seconds','ns'中的一个, + 例如:2006-08-14 02:34:56-06:00 +-r, --reference=FILE 显示文件的上次修改时间。 +-s, --set=STRING 根据字符串设置系统时间。 +-u, --utc, --universal 显示或设置世界协调时(UTC)。 +--help 显示帮助信息并退出。 +--version 显示版本信息并退出。 ``` -### 实例 +## 返回值 -格式化输出: +返回状态为成功除非给出了非法选项或非法参数。 + +## 例子 ```shell +# 格式化输出: date +"%Y-%m-%d" 2009-12-07 -``` -输出昨天日期: - -```shell +# 输出昨天日期: date -d "1 day ago" +"%Y-%m-%d" 2012-11-19 -``` -2秒后输出: - -```shell +# 2秒后输出: date -d "2 second" +"%Y-%m-%d %H:%M.%S" 2012-11-20 14:21.31 -``` -传说中的 1234567890 秒: - -```shell -date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" +# 传说中的 1234567890 秒: +date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S" +# 或者 +date -d@1234567890 +"%F %T" +# 输出结果 2009-02-13 23:02:30 -``` -普通转格式: - -```shell +# 时间格式转换: date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" +# 输出结果 2009/12/12 00:00.00 -``` -apache格式转换: - -```shell +# apache格式转换: date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" +# 输出结果 2009-12-05 00:00.37 -``` -格式转换后时间游走: - -```shell +# 格式转换后时间游走: date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" +# 输出结果 2007-12-05 00:00.37 -``` -加减操作: - -```shell -date +%Y%m%d # 显示前天年月日 +# 时间加减操作: +date +%Y%m%d # 显示年月日 date -d "+1 day" +%Y%m%d # 显示前一天的日期 date -d "-1 day" +%Y%m%d # 显示后一天的日期 date -d "-1 month" +%Y%m%d # 显示上一月的日期 date -d "+1 month" +%Y%m%d # 显示下一月的日期 date -d "-1 year" +%Y%m%d # 显示前一年的日期 date -d "+1 year" +%Y%m%d # 显示下一年的日期 -``` -设定时间: - -```shell +# 设定时间: date -s # 设置当前时间,只有root权限才能设置,其他只能查看 -date -s 20120523 # 设置成20120523,这样会把具体时间设置成空00:00:00 +date -s 20120523 # 设置成20120523,这样会把具体时间设置成00:00:00 date -s 01:01:01 # 设置具体时间,不会对日期做更改 date -s "01:01:01 2012-05-23" # 这样可以设置全部时间 date -s "01:01:01 20120523" # 这样可以设置全部时间 date -s "2012-05-23 01:01:01" # 这样可以设置全部时间 date -s "20120523 01:01:01" # 这样可以设置全部时间 -``` - -有时需要检查一组命令花费的时间,举例: - -```shell -#!/bin/bash +# 有时需要检查一组命令花费的时间: start=$(date +%s) nmap wangchujiang.com &> /dev/null - end=$(date +%s) difference=$(( end - start )) +# 显示执行时间 echo $difference seconds. -``` -当你考虑输出带有时间的字符串时,例如(Current time: 2019/05/19): - -最常用的方法: - -```shell +# 当你考虑输出带有时间的字符串时,例如(Current time: 2019/05/19): +# 通常使用的方法: echo "Current time: $(date +"%Y/%m/%d")" -``` - -另一种方法: -```shell +# 另一种方法: suffix='Current time:' -#和echo的用法差不多,注意如果换成单引号就不能替换变量了。 +# 注意如果换成单引号就不能替换变量了。 date +"${suffix} %Y/%m/%d" ``` +### 注意 + +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 date`或`info coreutils 'date invocation'`。 +