|
3 | 3 |
|
4 | 4 | 显示或设置系统时间与日期 |
5 | 5 |
|
6 | | -## 补充说明 |
| 6 | +## 概要 |
7 | 7 |
|
8 | | -**date命令** 是显示或设置系统时间与日期。 |
| 8 | +```shell |
| 9 | +date [OPTION]... [+FORMAT] |
| 10 | +date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] |
| 11 | +``` |
9 | 12 |
|
10 | | -很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。 |
| 13 | +## 主要用途 |
11 | 14 |
|
12 | | -### 语法 |
| 15 | +- 转换时间到选定的格式,默认为当前。 |
| 16 | +- 设置系统时间。 |
13 | 17 |
|
14 | | -```shell |
15 | | -date(选项)(参数) |
16 | | -``` |
| 18 | +## 参数 |
17 | 19 |
|
18 | | -### 选项 |
| 20 | +format:输出的时间格式。 |
19 | 21 |
|
20 | 22 | ```shell |
21 | | --d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号; |
22 | | --s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号; |
23 | | --u:显示GMT; |
24 | | ---help:在线帮助; |
25 | | ---version:显示版本信息。 |
| 23 | +format可用的转义序列如下: |
| 24 | + |
| 25 | +%% 百分号 |
| 26 | +%a 当地缩写的工作日名称(例如,Sun) |
| 27 | +%A 当地完整的工作日名称(例如,Sunday) |
| 28 | +%b 当地缩写的月份名称(例如,Jan) |
| 29 | +%B 当地完整的月份名称(例如,January) |
| 30 | +%c 当地的日期和时间(例如,Thu Mar 3 23:05:25 2005) |
| 31 | +%C 世纪,和%Y类似,但是省略后两位(例如,20) |
| 32 | +%d 一月中的一天(例如,01) |
| 33 | +%D 日期,等价于%m/%d/%y |
| 34 | +%e 一月中的一天,格式使用空格填充,等价于%_d |
| 35 | +%F 完整的日期;等价于%+4Y-%m-%d |
| 36 | +%g ISO标准计数周的年份的最后两位数字 |
| 37 | +%G ISO标准计数周的年份,通常只对%V有用 |
| 38 | +%h 等价于%b |
| 39 | +%H 小时,范围(00..23) |
| 40 | +%I 小时,范围(00..23) |
| 41 | +%j 一年中的一天,范围(001..366) |
| 42 | +%k 小时,使用空格填充,范围(0..23),等价于%_H |
| 43 | +%l 小时,使用空格填充,范围(1..12),等价于%_I |
| 44 | +%m 月,范围(01..12) |
| 45 | +%M 分钟,范围(00..59) |
| 46 | +%n 换行符 |
| 47 | +%N 纳秒,范围(000000000..000000000) |
| 48 | +%p 用于表示当地的AM或PM,如果未知则为空白 |
| 49 | +%P 类似于%p,但用小写表示 |
| 50 | +%q 季度,范围(1..4) |
| 51 | +%r 当地以12小时表示的时钟时间(例如,11:11:04 PM) |
| 52 | +%R 24小时每分钟;等价于%H:%M |
| 53 | +%s 自协调世界时1970年01月01日00时00分以来的秒数 |
| 54 | +%S 秒数,范围(00..60) |
| 55 | +%t 水平制表符 |
| 56 | +%T 时间;等价于%H:%M:%S |
| 57 | +%u 一周中的一天(1..7),1代表星期一 |
| 58 | +%U 一年中的第几周,周日作为一周的起始(00..53) |
| 59 | +%V ISO标准计数周,该方法将周一作为一周的起始(01..53) |
| 60 | +%w 一周中的一天(0..6),0代表星期天 |
| 61 | +%W 一年中的第几周,周一作为一周的起始(00..53) |
| 62 | +%x 当地的日期表示(例如,12/31/99) |
| 63 | +%X 当地的时间表示(例如,23:13:48) |
| 64 | +%y 年份后两位数字,范围(00..99) |
| 65 | +%Y 年份 |
| 66 | +%z +hhmm格式的数值化时区格式(例如,-0400) |
| 67 | +%:z +hh:mm格式的数值化时区格式(例如,-04:00) |
| 68 | +%::z +hh:mm:ss格式的数值化时区格式(例如,-04:00:00) |
| 69 | +%:::z 数值化时区格式,相比上一个格式增加':'以显示必要的精度(例如,-04,+05:30) |
| 70 | +%Z 时区缩写(如EDT) |
| 71 | + |
| 72 | +默认情况下,日期用零填充数字字段;以下可选的符号可以跟在'%'后面: |
| 73 | + |
| 74 | +- (连字符) 不要填充相应的字段。 |
| 75 | +_ (下划线) 使用空格填充相应的字段。 |
| 76 | +0 (数字0) 使用数字0填充相应的字段。 |
| 77 | ++ 用数字0填充,未来年份大于4位数字则在前面加上'+'号。 |
| 78 | +^ 允许的情况下使用大写。 |
| 79 | +# 允许的情况下将默认的大写转换为小写,默认的小写转换为大写。 |
| 80 | + |
| 81 | +在任何标志之后都有一个可选的字段宽度,如小数;然后是一个可选的修饰符,在可用的情况下,使用E来使用当地语言环境的替代表示, |
| 82 | +使用O来使用当地语言环境的替代数字符号。 |
26 | 83 | ``` |
27 | 84 |
|
28 | | -### 参数 |
29 | | - |
30 | | -<+时间日期格式>:指定显示时使用的日期时间格式。 |
31 | | - |
32 | | -### 日期格式字符串列表 |
| 85 | +## 选项 |
33 | 86 |
|
34 | 87 | ```shell |
35 | | -%H # 小时,24小时制(00~23) |
36 | | -%I # 小时,12小时制(01~12) |
37 | | -%k # 小时,24小时制(0~23) |
38 | | -%l # 小时,12小时制(1~12) |
39 | | -%M # 分(00~59) |
40 | | -%p # 显示出上午或下午 |
41 | | -%r # 时间,12小时制 |
42 | | -%s # 从1970年1月1日0点到目前经历的秒数 |
43 | | -%S # 秒(00~59) |
44 | | -%T # 时间(24小时制)(hh:mm:ss) |
45 | | -%X # 显示时间的格式(%H时%M分%S秒) |
46 | | -%Z # 按字母表排序的时区缩写 |
47 | | -%a # 星期名缩写 |
48 | | -%A # 星期名全称 |
49 | | -%b # 月名缩写 |
50 | | -%B # 月名全称 |
51 | | -%c # 日期和时间 |
52 | | -%d # 按月计的日期(01~31) |
53 | | -%D # 日期(mm/dd/yy) |
54 | | -%h # 和%b选项相同 |
55 | | -%j # 一年的第几天(001~366) |
56 | | -%m # 月份(01~12) |
57 | | -%w # 一个星期的第几天(0代表星期天) |
58 | | -%W # 一年的第几个星期(00~53,星期一为第一天) |
59 | | -%x # 显示日期的格式(mm/dd/yy) |
60 | | -%y # 年份的最后两个数字(1999则是99) |
61 | | -%Y # 年份(比如1970、1996等) |
62 | | -%C # 世纪,通常为省略当前年份的后两位数字 |
63 | | -%U # 一年中的第几周,以周日为每星期第一天 |
64 | | -%e # 按月计的日期,添加空格,等于%_d |
| 88 | +长选项与短选项等价 |
| 89 | + |
| 90 | +-d, --date=STRING 解析字符串并按照指定格式输出,字符串不能是'now'。 |
| 91 | +--debug 注释已解析的日期,并将有疑问的用法发送到标准错误。 |
| 92 | +-f, --file=DATEFILE 类似于--date; 一次从DATEFILE处理一行。 |
| 93 | +-I[FMT], --iso-8601[=FMT] 按照ISO 8601格式输出,FMT可以为'date'(默认),'hours','minutes','seconds','ns'。 |
| 94 | + 例如:2006-08-14T02:34:56-06:00 |
| 95 | +-R, --rfc-email 按照RFC 5322格式输出,例如: Mon, 14 Aug 2006 02:34:56 -0600 |
| 96 | +--rfc-3339=FMT 按照RFC 3339格式输出,FMT可以为'date', 'seconds','ns'中的一个, |
| 97 | + 例如:2006-08-14 02:34:56-06:00 |
| 98 | +-r, --reference=FILE 显示文件的上次修改时间。 |
| 99 | +-s, --set=STRING 根据字符串设置系统时间。 |
| 100 | +-u, --utc, --universal 显示或设置世界协调时(UTC)。 |
| 101 | +--help 显示帮助信息并退出。 |
| 102 | +--version 显示版本信息并退出。 |
65 | 103 | ``` |
66 | 104 |
|
67 | | -### 实例 |
| 105 | +## 返回值 |
68 | 106 |
|
69 | | -格式化输出: |
| 107 | +返回状态为成功除非给出了非法选项或非法参数。 |
| 108 | + |
| 109 | +## 例子 |
70 | 110 |
|
71 | 111 | ```shell |
| 112 | +# 格式化输出: |
72 | 113 | date +"%Y-%m-%d" |
73 | 114 | 2009-12-07 |
74 | | -``` |
75 | | - |
76 | | -输出昨天日期: |
77 | 115 |
|
78 | | -```shell |
| 116 | +# 输出昨天日期: |
79 | 117 | date -d "1 day ago" +"%Y-%m-%d" |
80 | 118 | 2012-11-19 |
81 | | -``` |
82 | | - |
83 | | -2秒后输出: |
84 | 119 |
|
85 | | -```shell |
| 120 | +# 2秒后输出: |
86 | 121 | date -d "2 second" +"%Y-%m-%d %H:%M.%S" |
87 | 122 | 2012-11-20 14:21.31 |
88 | | -``` |
89 | | - |
90 | | -传说中的 1234567890 秒: |
91 | 123 |
|
92 | | -```shell |
93 | | -date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S" |
| 124 | +# 传说中的 1234567890 秒: |
| 125 | +date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%M:%S" |
| 126 | +# 或者 |
| 127 | +date -d@1234567890 +"%F %T" |
| 128 | +# 输出结果 |
94 | 129 | 2009-02-13 23:02:30 |
95 | | -``` |
96 | | - |
97 | | -普通转格式: |
98 | 130 |
|
99 | | -```shell |
| 131 | +# 时间格式转换: |
100 | 132 | date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S" |
| 133 | +# 输出结果 |
101 | 134 | 2009/12/12 00:00.00 |
102 | | -``` |
103 | | - |
104 | | -apache格式转换: |
105 | 135 |
|
106 | | -```shell |
| 136 | +# apache格式转换: |
107 | 137 | date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S" |
| 138 | +# 输出结果 |
108 | 139 | 2009-12-05 00:00.37 |
109 | | -``` |
110 | 140 |
|
111 | | -格式转换后时间游走: |
112 | | - |
113 | | -```shell |
| 141 | +# 格式转换后时间游走: |
114 | 142 | date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S" |
| 143 | +# 输出结果 |
115 | 144 | 2007-12-05 00:00.37 |
116 | | -``` |
117 | 145 |
|
118 | | -加减操作: |
119 | | - |
120 | | -```shell |
121 | | -date +%Y%m%d # 显示前天年月日 |
| 146 | +# 时间加减操作: |
| 147 | +date +%Y%m%d # 显示年月日 |
122 | 148 | date -d "+1 day" +%Y%m%d # 显示前一天的日期 |
123 | 149 | date -d "-1 day" +%Y%m%d # 显示后一天的日期 |
124 | 150 | date -d "-1 month" +%Y%m%d # 显示上一月的日期 |
125 | 151 | date -d "+1 month" +%Y%m%d # 显示下一月的日期 |
126 | 152 | date -d "-1 year" +%Y%m%d # 显示前一年的日期 |
127 | 153 | date -d "+1 year" +%Y%m%d # 显示下一年的日期 |
128 | | -``` |
129 | 154 |
|
130 | | -设定时间: |
131 | | - |
132 | | -```shell |
| 155 | +# 设定时间: |
133 | 156 | date -s # 设置当前时间,只有root权限才能设置,其他只能查看 |
134 | | -date -s 20120523 # 设置成20120523,这样会把具体时间设置成空00:00:00 |
| 157 | +date -s 20120523 # 设置成20120523,这样会把具体时间设置成00:00:00 |
135 | 158 | date -s 01:01:01 # 设置具体时间,不会对日期做更改 |
136 | 159 | date -s "01:01:01 2012-05-23" # 这样可以设置全部时间 |
137 | 160 | date -s "01:01:01 20120523" # 这样可以设置全部时间 |
138 | 161 | date -s "2012-05-23 01:01:01" # 这样可以设置全部时间 |
139 | 162 | date -s "20120523 01:01:01" # 这样可以设置全部时间 |
140 | | -``` |
141 | | - |
142 | | -有时需要检查一组命令花费的时间,举例: |
143 | | - |
144 | | -```shell |
145 | | -#!/bin/bash |
146 | 163 |
|
| 164 | +# 有时需要检查一组命令花费的时间: |
147 | 165 | start=$(date +%s) |
148 | 166 | nmap wangchujiang.com &> /dev/null |
149 | | - |
150 | 167 | end=$(date +%s) |
151 | 168 | difference=$(( end - start )) |
| 169 | +# 显示执行时间 |
152 | 170 | echo $difference seconds. |
153 | | -``` |
154 | 171 |
|
155 | | -当你考虑输出带有时间的字符串时,例如(Current time: 2019/05/19): |
156 | | - |
157 | | -最常用的方法: |
158 | | - |
159 | | -```shell |
| 172 | +# 当你考虑输出带有时间的字符串时,例如(Current time: 2019/05/19): |
| 173 | +# 通常使用的方法: |
160 | 174 | echo "Current time: $(date +"%Y/%m/%d")" |
161 | | -``` |
162 | | - |
163 | | -另一种方法: |
164 | | -```shell |
| 175 | +# 另一种方法: |
165 | 176 | suffix='Current time:' |
166 | | -#和echo的用法差不多,注意如果换成单引号就不能替换变量了。 |
| 177 | +# 注意如果换成单引号就不能替换变量了。 |
167 | 178 | date +"${suffix} %Y/%m/%d" |
168 | 179 | ``` |
169 | 180 |
|
| 181 | +### 注意 |
| 182 | + |
| 183 | +1. 该命令是`GNU coreutils`包中的命令,相关的帮助信息请查看`man -s 1 date`或`info coreutils 'date invocation'`。 |
| 184 | + |
170 | 185 | <!-- Linux命令行搜索引擎:https://jaywcjlove.github.io/linux-command/ --> |
0 commit comments