date命令:
在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令将给自己的工作带来诸多方便。date命令是Linux系统里自带的一个系统命令,Linux中的date命令可以用来显示或设定系统的日期与时间,并且在很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。
1 命令功能
date命令用来显示当前系统时间或设定时间.
2、date命令有两种使用格式:
date [OPTION]... [+FORMAT]:<------用于显示时间
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]: <------用于设置时间
2.1 选项-OPTION:
-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s<字符串>:根据字符串来设置日期与时间。字符串前必须加上双引号;
-R:以RFC 5322格式输出日期和时间。例如:Mon, 14 Aug 2006 02:34:56 -0600
2.2、显示时间的格式-FORMAT:
date [OPTION]... [+FORMAT]: |
date命令指定显示时间的格式[FORMAT]选项介绍如下:
%a :显示查看当日星期的英文缩写
%A :显示查看当日星期的英文全名
%b : 显示月份的英文缩写
%B:显示月份的全名
%c :显示区域设置的日期和时间
%C: 显示世纪;类似于%Y,会省略最后两位数字(例如,%Y显示为年份2022,那么%C显示会省略后两位,%C只显示20)。
%d:显示当天的日期
%D:显示月日年,格式: 月/日/年
%e : 显示当天的日期
%F :显示全日期年月日,格式为:年-月-日
%g:显示年份的后两位数字
%G year of ISO week number (see %V); normally useful only with %V
%h same as %b 显示月份的英文缩写
%H hour (00..23) 显示当前时间小时
%I hour (01..12)
%j day of year (001..366)
%k hour, space padded ( 0..23); same as %_H
%l hour, space padded ( 1..12); same as %_I
%m month (01..12) 显示月份以数字显示
%M minute (00..59) 以数字显示分钟数
%n a newline 换行
%N nanoseconds (000000000..999999999) 显示纳秒
%p locale's equivalent of either AM or PM; blank if not known 显示上午(AM)或下午(PM)
%P like %p, but lower case 和%p一样,但显示的是小写字母
%r locale's 12-hour clock time (e.g., 11:11:04 PM) 显示时间,格式为:11:11:04 PM
%R 24-hour hour and minute; same as %H:%M 显示时间的小时和分钟
%s seconds since 1970-01-01 00:00:00 UTC 从1970一月一日零点零分零秒到此刻所经过的秒数
%S second (00..60) 显示秒钟
%t a tab
%T time; same as %H:%M:%S 显示时间为小时:分钟:秒
%u day of week (1..7); 1 is Monday 显示星期几,以数字显示,如显示为1 ,就是星期一
%U week number of year, with Sunday as first day of week (00..53)
%V ISO week number, with Monday as first day of week (01..53)
%w day of week (0..6); 0 is Sunday 显示每周的第几天,星期一为1,星期日显示为0
%W week number of year, with Monday as first day of week (00..53)
%x locale's date representation (e.g., 12/31/99) 显示格式为:12/31/99
%X locale's time representation (e.g., 23:13:48) 显示格式为:12:00:52 AM
%y last two digits of year (00..99) 显示年份后两位
%Y year 显示完整年份
%z +hhmm numeric time zone (e.g., -0400) 显示数字时区
%:z +hh:mm numeric time zone (e.g., -04:00)
%::z +hh:mm:ss numeric time zone (e.g., -04:00:00)
%:::z numeric time zone with : to necessary precision (e.g., -04, +05:30)
%Z alphabetic time zone abbreviation (e.g., EDT)
3 date的FORMAT使用实例:
root@ubuntn:~# date +%A Saturday //以英文显示星期几 root@ubuntn:~# date +%d 17 //显示当天的日期 root@ubuntn:~# date +%h Mar //以英文显示月份缩写 和使用%b一样 root@ubuntn:~# date +%H 10 //显示时间点数 10为10点 root@ubuntn:~# date +%m 03 //以数字显示月份 root@ubuntn:~# date +%M 21 //以数字显示分钟数 root@ubuntn:~# date +%S 30 //显示秒钟 root@ubuntn:~# date +%Y 2018 //显示年份 root@ubuntn:~# date +%F 2018-03-17 //显示日期全格式 root@ubuntn:~# date +%Y-%m-%d 2018-03-17 //显示日期全格式 root@ubuntn:~# date +%Y-%m-%d-%H:%M 2018-03-17-10:41 root@ubuntn:~# date +%Y-%m-%d-%H:%M:%S 2018-03-17-10:41:49 //显示日期和全部时间,%T和%H:%M:%S 显示时间一样,都为为小时:分钟:秒 root@ubuntn:~# date +%F_%T 2018-03-17_10:47:53 root@ubuntn:~# |
4 date命令其他使用如下方式:
root@ubuntn:~# date +"This year is %Y" This year is 2018 root@ubuntn:~# date +"This year is %Y.Today is %d" This year is 2018.Today is 17 root@ubuntn:~# date +"This year is %Y.%nToday is %d" This year is 2018. Today is 17 获取指定时间从1970年1月1日到指定时间经过的秒数,如获取2017年10月20日,就是获取从1970年1月1日到2017年10月20日经过的秒数,如下: root@ubuntn:~# date -d"2017-10-20" +%s 1508428800 root@ubuntn:~# |
5 查看系统时间时区
root@ubuntn:~# date -R Fri, 14 Jul 2023 07:40:51 +0000 root@ubuntn:~#
|
备注:+0000:表示为0时区,而中国所在的时区是东八区,Ubuntu服务器版在安装的时候没有选择时区的配置。
这样使用date命令修改时间的时候,修改后的时候还是零时区的时间,而不是中国的东八区的时间,需要修改时区后再修改时间,
这样修改后的时间才是中国的东八区的时间。
5.1 修改时区
我们将时区设置为Asia/Shanghai
(1)、查看所有可用时区:timedatectl list-timezones
使用timedatectl list-timezones命令会显示很多时区,我们可以过滤至查看要使用的时区,如下:
root@ubuntn:~# timedatectl list-timezones | grep -i 'shang' Asia/Shanghai root@ubuntn:~# |
(2)、将时区设置为Asia/Shanghai,修改方法:
root@ubuntn:~# timedatectl set-timezone Asia/Shanghai |
(3)、查看时间和时区:
root@ubuntn:~# timedatectl status Local time: Sat 2023-07-15 18:49:32 CST Universal time: Sat 2023-07-15 10:49:32 UTC RTC time: Sat 2023-07-15 10:49:32 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: yes NTP service: active RTC in local TZ: no root@ubuntn:~# |
+0800就表示时区是东八区
6 设置系统时间
在Linux中有两个时钟:系统时钟和硬件时钟
硬件时钟:记录在服务器主板的CMOS芯片里面
系统时钟:也叫做操作系统时间、kernel clock或者software clock,是基于时间中断器的软件计数器.
系统时钟和硬件时钟在一定的场景下会互相影响,比如:
hwclock:显示硬件时钟,同时还可以实现从系统时钟到硬件时钟,或者从系硬件时钟到统时钟的同步
-s,--hctosys: 把硬件时钟写入系统
-w,--systohc:把系统时间写到硬件
6.1 使用示例:
(1)、查看系统时间
root@ubuntn:~# date Sat Jul 15 10:07:05 PM CST 2023 |
(2)、查看硬件时间
root@ubuntn:~# hwclock 2023-07-15 22:07:22.996732+08:00 root@ubuntn:~# |
6.2、date命令用于设置系统时间的格式:
date [MMDDhhmm[[CC]YY][.ss]]
参数说明:
MM:月份
DD:日期
hh:小时
mm:分钟
YY:两位年份
CCYY:四位年份
(1)、示例:
root@ubuntn:~# date 071521582023.00 Sat Jul 15 09:58:00 PM CST 2023 root@ubuntn:~# |
扩展:如果发现和实际时间相差过多,于是手动修改,但可能无法修改为其他时间,因为系统可能已经开启时间自动同步.
如果使用timedatectl set-time “YYYY-MM-DD HH:MM:SS”来设置日期时间会提示“Failed to set time: Automatic time synchronization is enabled”,而使用date命令修改则没有提示。
root@ubuntn:~# timedatectl set-time "2023-07-15 22:25:00" Failed to set time: Automatic time synchronization is enabled root@ubuntn:~# |
这时需要时间需要关闭时间自动同步,先执行 timedatectl set-ntp no 关闭时间自动同步。
root@ubuntn:~# timedatectl set-ntp no |
(2)、修改时间后防止重启失效,把系统时间写到硬件
root@ubuntn:~# hwclock --systohc |
1.6.3 使用-s参数设置系统时间
root@ubuntn:~# date -s "2023-07-15 23:10:20" |
7 修改成24小时制
把时间格式调整为24小时制,编辑文件/etc/default/locale,增加一行“LC_TIME=en_DK.UTF-8”内容即可,如下:
root@ubuntn:~# echo "LC_TIME=en_DK.UTF-8" >> /etc/default/locale |
修改后重启系统,配置生效,在使用date命令查看时间时就会显示24小时格式的时间。如下:
root@ubuntn:~# date Sat Jul 15 23:15:18 CST 2023 root@ubuntn:~# |
8 date命令扩展 - 显示未来时间和历史时间
(1)、显示历史时间
显示10秒前的时间: root@ubuntn:~# date +%F_%T_%N 2023-07-15_10:26:27_189760018 root@ubuntn:~# date +%F_%T_%N -d "-10second" //显示10秒前的时间 2023-07-15_10:26:17_979222973 root@ubuntn:~#
显示2分钟前的时间: root@ubuntn:~# date +%F_%T_%N 2023-07-15_10:19:43_208687673 //当前时间,精确到纳秒 root@ubuntn:~# date +%F_%T_%N -d "-2minute" 2023-07-15_10:17:43_892144373 //显示两分钟前的时间 root@ubuntn:~# |
显示当前年月日 root@ubuntn:~# date +%F 2023-07-15 root@ubuntn:~# 显示当前后一天的日期 root@ubuntn:~# date +%F -d "+1day" 2023-07-16 root@ubuntn:~# 显示下一月的日期 root@ubuntn:~# date +%F -d "+1month" 2023-08-15 root@ubuntn:~# 显示下一年的日期 root@ubuntn:~# date +%F -d "+1year" 2024-07-15 root@ubuntn:~# |
(3)、显示未来时间
显示前一天的日期 root@ubuntn:~# date +%F -d "-1day" 2023-07-14 root@ubuntn:~# 显示上一月的日期 root@ubuntn:~# date +%F -d "-1month" 2023-06-15 root@ubuntn:~# 显示前一年的日期 root@ubuntn:~# date +%F -d "-1year" 2022-07-15 root@ubuntn:~# |