linux——date命令
linux的date命令非常强大,我们除了可以通过date命令查看系统当前时间外,还可以通过该命令来进行时间格式化、时间计算等相关操作。
- 查看当前时间date
[root@izwz93jpghqh4vdu29xzxkz ~]# date
Fri Aug 14 14:29:32 CST 2020
我们可以看到,直接使用date命令显示的时间并不是我们日常生活中常见的日期格式规范,我们可以通过linux提供的格式化
命令 | 作用 |
---|---|
%n | 下一行 |
%t | 跳格 |
%H | 小时(00-23) |
%I | 小时(01-12) |
%k | 小时(0-23) |
%l | 小时(1-12) |
%M | 分钟(00-59) |
%p | 显示本地 AM 或 PM |
%r | 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) |
%s | 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 |
%S | 秒(00-60) |
%T | 直接显示时间 (24 小时制) |
%X | 相当于 %H:%M:%S |
%Z | 显示时区 |
%a | 星期几 (Sun-Sat) |
%A | 星期几 (Sunday-Saturday) |
%b | 月份 (Jan-Dec) |
%B | 月份 (January-December) |
%c | 直接显示日期与时间 |
%d | 日 (01-31) |
%D | 直接显示日期 (mm/dd/yy) |
%h | 同 %b |
%j | 一年中的第几天 (001-366) |
%m | 月份 (01-12) |
%U | 一年中的第几周 (00-53) (以 Sunday 为一周的第一天的情形) |
%w | 一周中的第几天 (0-6) |
%W | 一年中的第几周 (00-53) (以 Monday 为一周的第一天的情形) |
%x | 直接显示日期 (mm/dd/yy) |
%y | 年份的最后两位数字 (00.99) |
%Y | 完整年份 (0000-9999) |
实例:
[root@izwz93jpghqh4vdu29xzxkz ~]# date +"%Y-%m-%d-%H-%m-%S" --根据年月日时分秒格式来显示当前时间
2020-08-14-14-08-18
[root@izwz93jpghqh4vdu29xzxkz ~]# date +"%D %x"
08/14/20 08/14/2020
[root@izwz93jpghqh4vdu29xzxkz ~]# date +"%x %X"
08/14/2020 02:52:28 PM
- 根据当前时间计算date
-- 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 #显示下一年的日期
[root@izwz93jpghqh4vdu29xzxkz ~]# date -d "1 day ago" +"%Y-%m-%d" -- 等同于date -d "-1 day" +"%Y-%m-%d"
2020-08-13
- 设置当前系统时间
date -s #设置当前时间,只有root权限才能设置,其他只能查看
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" #这样可以设置全部时间
计算执行一组命令后一共消耗了多少时间
#!/bin/bash
start=$(date +%s)
nmap man.linuxde.net &> /dev/null
end=$(date +%s)
difference=$(( end - start ))
echo it takes $difference seconds.
番外拓展——修正系统时钟
平时我们难免会因为测试需要而临时改动系统的操作时间,等到测试结束后我们肯定是需要把系统的时间恢复到正常的时间点,手动去用date
命令设置时间并不靠谱,更加推荐的是我们结合其他命令来同步校正系统的时间。
下面会用hwclock
命令来进行演示,演示之前不妨先简单了解一下一些前置知识。
了解硬件时钟和系统时钟的作用
在Linux中有硬件时钟与系统时钟两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在 BIOS画面设定的时钟。系统时钟则是指kernel中的 时钟。当Linux启动时,系统时钟会去读取硬件时钟的设定,之後系统时钟即独立运作。所有Linux相关指令与函数都是读取系统时钟的设定。hwclock
实现了BIOS和linux的时间同步。
我们使用date
命令修改的日期其实是系统时钟,而硬件时钟并没有被改动到。我们可以使用hwclock
来重新恢复我们的系统时钟。使用
hwclock -s
命令来修正系统时钟
我们可以使用hwclock man
来看一下这个命令支持我们做哪些操作,可以看到我们可以通过hwclock --show
命令来看当前硬件时钟的日期时间,通过hwclock -s
命令来将硬件时钟的时间同步到当前的系统时间里面,从而实现系统时钟的修正。
需要注意的是,随着系统的运行硬件时间可能也存在被误操作修改的问题,所以比较常见的,我们会跑一个crontab定时任务来定期更新我们服务器的硬件时钟。当然了,如果服务器有外网环境的话,相关的方法就更多了。
hwclock man
Usage:
hwclock [function] [option...]
Functions:
-h, --help show this help text and exit
-r, --show read hardware clock and print result
--set set the RTC to the time given with --date
-s, --hctosys set the system time from the hardware clock
-w, --systohc set the hardware clock from the current system time
--systz set the system time based on the current timezone
--adjust adjust the RTC to account for systematic drift since
the clock was last set or adjusted
-c, --compare periodically compare the system clock with the CMOS clock
--getepoch print out the kernel's hardware clock epoch value
--setepoch set the kernel's hardware clock epoch value to the
value given with --epoch
--predict predict RTC reading at time given with --date
-V, --version display version information and exit
Options:
-u, --utc the hardware clock is kept in UTC
--localtime the hardware clock is kept in local time
-f, --rtc <file> special /dev/... file to use instead of default
--directisa access the ISA bus directly instead of /dev/rtc
--badyear ignore RTC's year because the BIOS is broken
--date <time> specifies the time to which to set the hardware clock
--epoch <year> specifies the year which is the beginning of the
hardware clock's epoch value
--noadjfile do not access /etc/adjtime; this requires the use of
either --utc or --localtime
--adjfile <file> specifies the path to the adjust file;
the default is /etc/adjtime
--test do not update anything, just show what would happen
-D, --debug debugging mode