深入解析 Linux 系统下的 date 命令
功能
从内核读取日期时间或设置内核日期时间。 只有超级用户可以设置。 查看帮助:
$ man date
UTC / CST / GMT / DST 含义
CST = China Standard Time = 北京时间/中国标准时间 = 在时区划分上,属东八区,比协调世界时早 8 小时,记为 UTC+8 GMT = Greenwich Mean Time = 格林威治标准时间 = 是指位于英国伦敦郊区的格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线 UTC = Universal Time Coordinated = 协调世界时 DST = Daylight Saving Time = 夏令时 = 一个地区的标准时间,即在夏令时 (DST, Daylight Saving Time) 时期以外使用的当地时间。全球 60% 以上的国家全年都只使用标准时间。而剩下的那些国家则在夏季使用夏令时,通常是把时钟从标准时间向前调 1 小时。
实例
默认输出
$ date
2020年 7月28日 星期二 21时24分46秒 CST
显示时间戳对应的日期时间
$ date -r 1595942824
2020年 7月28日 星期二 21时27分04秒 CST
显示文件的最后修改时间
$ date -r package-lock.json
2018年 7月23日 星期一 20时42分43秒 CST
显示 UTC 时间
$ date -u
2020年 7月28日 星期二 13时29分49秒 UTC
格式化输出时间
若想按指定格式输出,使用双引号加 +
号开头设置,同时使用 %
前缀指定显示项:
$ date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"
DATE: 2020-07-28
TIME: 23:02:57
-
%Y
:全写年份,1980-2038 -
%y
:简写年份:80-38 -
%m
:两位数月份,01-12 -
%n
:换行 -
%H
:两位数 24 小时制,00-23 -
%M
:两位数分钟数,00-59 -
%S
:两位数描述,00-59
设置显示时间
使用 -v
选项可设置当前时间的某一项,并显示。注意这里不是设置时间,没有真正改变系统的日期时间,只是显示(输出)变了。支持设置「年、月、日、星期、时、分、秒」,支持使用加减号 +
、-
设置。
-v
选项后面的字符必须是 「y, m, w, d, H, M 或 S」,分别表示「年、月、星期、日、时、分、秒」。且其值必须符合真实时间,限制如下:
字符 | 含义 | 范围限制 |
---|---|---|
y | 年 | 必须在 80-38 或 1980-2038 之间 |
m | 月 | 必须在 1-12(Jan-Dec) 之间 |
w | 星期 | 0-6 (Sun-Sat) |
d | 日 | 1-31 |
H | 时 | 0-23 |
M | 分 | 0-59 |
S | 秒 | 0-59 |
精确设置指定项
例如,假设当前时间为:
$ date
2020年 7月28日 星期二 21时56分09秒 CST
设置年份:
// 将年份设为 2021 年
$ date -v 21y
2021年 7月28日 星期三 21时57分07秒 CST
设置月份,支持数字和英文简写:
// 将月份设为 8 月
$ date -v 8m
2020年 8月28日 星期五 21时58分02秒 CST
// 将月份设为一月
$ date -v Janm
2020年 1月28日 星期二 22时04分38秒 CST
设置日:
// 将日份设为 29 日
$ date -v 29d
2020年 7月29日 星期三 21时58分51秒 CST
设置小时数:
// 将小时数设为 22
$ date -v 22H
2020年 7月28日 星期二 22时59分40秒 CST
设置分钟数:
// 将分钟数设为 30
$ date -v 30M
2020年 7月28日 星期二 22时30分21秒 CST
设置秒数:
// 将描述设为 30
$ date -v 30S
2020年 7月28日 星期二 22时00分30秒 CST
设置星期,支持数字和英文简写,时间往前推:
// 设为星期一
$ date -v 1w
2020年 7月27日 星期一 22时07分09秒 CST
// 设为星期日
$ date -v Sunw
2020年 7月26日 星期日 22时13分44秒 CST
设置值超出范围
当设置的值超出范围时,date
命令将显示命令使用方法:
// 设置日期为 32,超出了 1-31 的取值
$ date -v 32d
32d: Cannot apply date adjustment
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
使用 + - 符号设置
// 当前时间往前 2 小时
$ date -v -2H
2020年 7月28日 星期二 20时31分22秒 CST
// 当前时间往后 2 小时
$ date -v +2H
2020年 7月29日 星期三 00时33分24秒 CST
// 当前时间往后 1 个月
$ date -v +1m
2020年 8月28日 星期五 22时47分59秒 CST
// 设为上个星期五
$ date -v-fri
2020年 7月24日 星期五 22时57分33秒 CST
注意:若使用
+1m
时,若当前为 5 月 31 日,则结果会输出 6 月 30 日;若当前为 1 月 31 日,则结果根据平闰年为 2 月 28 日或 2 月 29 日,即月份往前一个月,但该日期不存在,会自动转换为下一个月的最后一天显示。
同时设置多个项
// 设置为 12 月 31 日
$ date -v 12m -v 31d
2020年12月31日 星期四 22时37分11秒 CST
// 设为 1 年后的 1 月份
$ date -v1m -v+1y
2021年 1月28日 星期四 22时55分30秒 CST
注意设置的顺序,最好按「年月日」顺序设置,否则,假如当前是 2 月份,使用
date -v 31d -v 12m
将无法设置成功,因为先设置为 2 月 31 日,这个时间实际是不存在的。使用date -v 12m -v 31d
设置则不会出错。
参考
- 个人博客原文地址:Linux date 命令使用详解
- 什么是标准时间?