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
posted @ 2020-08-14 15:22  moutory  阅读(29)  评论(0编辑  收藏  举报  来源