第一次发文,大佬勿喷。
什么是linux date
在Linux
中,date
命令是最基础的也是最实用的linux
命令,虽然它不是其内置命令,但是还是非常重要的,我们通过通过该命令查看时间、修改时间 或者是 格式化时间,date
都可以运用自如,本篇将来介绍如何使用date
命令玩转时间。
如果在linux
中,没有date
命令(一般不会),则需要安装coreutils
包才行,centos
安装参考:
# yum install coreutils
安装完毕后,可以查看date
的版本:
# date --version
小技巧
如何查看命令是否是内置的呢?可以使用
type
跟上命令来查看,如果输出is a shell builtin
则是内置命令,否则是外部命令。
例如: cd
是内置命令,可以使用type cd
来查询:
# type cd cd is a shell builtin #
而
date
则不是,同样可以使用type date
来查询:# type date date is hashed (/usr/bin/date) #
date
输出当前时间
在linux
中,我们仅需在终端中输入date
而后回车,即可得到当前系统时间,例如:
# date
Tue Jul 24 21:02:22 CST 2023
#
上述命令已经输出了系统的时间,它所对应的格式为 星期、月份、时区、时间、年份,即 输出的时间为 “2023年07月24日晚上21点02分22秒”,时区信息为CST
则表示中国标准时间,是由UTC+8
小时得来的。
自定义格式
除了固定格式外,还支持自定义格式,在date
后面跟上+
,输入相应的格式字符,也可以输出时间,其中格式字符参照为:
格式字符串 | 含义 |
---|---|
%Y | 4位数的年 |
%y | 2位数的年 |
%m | 月份 |
%d | 月的天数 |
%H | 24小时制 |
%I | 12小时制 |
%M | 分钟 |
%S | 秒数 |
来尝试一下,输出当前时间,可以使用命令:
# date +"%Y-%m-%d %H:%M:%S"
2023-07-24 21:26:20
#
如上命令,使用date
按照时间格式“年-月-日 时:分:秒” 的格式输出时间,只需输入date +
格式字符串即可。
其实上面命令还有更加简约的方式,即: %Y-%m-%d
可以使用%F
代替,%H:%M:%S
可以使用%T
代替,即,这样的命令也可以输出格式化后的时间:
# date +"%F %T"
2023-07-24 21:29:45
#
关键字转义
从上面案例,知道了%
是自定义格式的关键字,那么如果想输出2023%07%24
这种格式的,应该如何写呢?
直接使用%Y%%m%%d
, 其效果会变成这样:
# date +"%Y%%m%%d"
2023%m%d
#
这种情况下,可以使用%%
来转义该%
字符,即:
# date +"%Y%%%m%%%d"
2023%07%24
#
如上案例看上去非常复杂,其实解析下来非常简单,即:
如图所示,其中%%
会被转义为普通字符%
。
转换为时间戳
在date
中,若想获取当前时间的时间戳,可以使用date +"%s"
来实现,例如:
# date +"%s"
1690206604
#
若想获取其他时间的时间戳,可以使用-d
指定时间,再使用+%s
转换为时间戳,例如:
# date -d"2023-07-24 21:50:04" +"%s"
1690206604
#
输出特殊的时间
假设有一个需求,给定一个时间,想要获取该时间是属于当前周的周几?应该如何写呢?
其实这个非常简单哈,这里简单些一个小脚本案例:
#!/bin/bash
# 给定一个时间,想要获取该时间是属于当前周的周几
read -p "请输入时间,格式为[YYYY-mm-dd HH:MM:SS]" dates
# 转换为时间戳
unixDate=$(date -d "$dates" +"%s")
# 获取从格林时间以来经过的天数
days=$(( $unixDate / (24 * 60 * 60)))
# 获取周几
week=$(( ($days + 4) % 7 ))
echo "$week"
上面的脚本含义非常简单,先使用read
获取时间,存储在变量dates
中,而后将dates
转换为时间戳,存储到变量unixDate
中,而后获取自unix
时间为0,即北京时间1970-01-01 08:00:00
至当前unixDte
时间戳存储的天数,最后将 天数+4对7进行取余,加上4的意思为1970-01-01
是从周四开始的,所以需要加上4。
脚本执行后效果如下:
上述只是实现了一个最简单的功能,所以没有对用户输入的时间进行检验。但是可以看到,如果输入正常时间,是可以推算出时间是周几的。
上面的实现是不是非常复杂呢,其实在date
中,已经提供好了相应的命令,使用date +"%u"
即可获取今天是本周的周几,例如:
# date +"%u"
1
#
假设想要获取2023-07-25
是周几,可以使用-d
来指定时间,再使用+%u
来获取周几,命令即:
# date -d "2023-07-25" +"%u"
2
#
上面只是一个简单的抛砖引玉,其实date
提供了非常多的这种案例,转换为表格为:
格式字符串 | 含义 |
---|---|
%u | 获取时间是周几(1-7) |
%w | 获取时间是周几(0-6)0是周末 |
%j | 获取时间是一年的地多少天 |
%U | 获取时间是一年的第多少周 |
这里就不过多展示了。
总结
在centos
中,如果没有date
命令,则可以使用yum install coreutils
安装即可。直接使用date
会输出当前时间,格式为星期、月份、时区、时间、年份,不仅如此,还能支持众多的格式,比如%F %T
可以以yyyy-mm-dd HH:MM:SS
的形式输出时间。最后介绍了如何获取特殊的时间,例如:时间是周几、是本年的第多少周等等。文章只是起到一个抛砖引玉的作用,如果感兴趣,还请使用man date
查看更加详细的信息。