欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

深入解析 Linux 系统下的 date 命令

最编程 2024-08-03 07:44:20
...

功能

从内核读取日期时间或设置内核日期时间。 只有超级用户可以设置。 查看帮助:

$ 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 命令使用详解
  • 什么是标准时间?