【Linux】一步一步学Linux——date命令(81)

00. 目录

01. 命令概述

date - 打印或设置系统日期和时间

若是不以加号作为开头,则表示要设定时间,而时间格式MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数。

很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。

02. 命令格式

date [选项]... [+格式]
date [选项] [MMDDhhmm[[CC]YY][.ss]]

03. 常用选项

描述
       根据指定格式显示当前时间或设置系统时间.
       -d, --date=STRING
              显示由 STRING 指定的时间, 而不是当前时间
       -f, --file=DATEFILE
           显示  DATEFILE 中每一行指定的时间, 如同将 DATEFILE 中的每行作为--date 的参数一样
           -I,--iso-8601[=TIMESPEC]按照ISO-8601的日期/时间格式输出时间.
           TIMESPEC=`date'  (或者不指定时)仅输出日期,等于  `hours',  `min‐utes', 或`seconds' 时按照指定精度输出日期及时间.
       -r, --reference=FILE
              显示 FILE 的最后修改时间
       -R, --rfc-822
              根据 RFC-822 指定格式输出日期
       -s, --set=STRING
              根据 STRING 设置时间
       -u, --utc, --universal
              显示或设置全球时间(格林威治时间)
       --help 显示本帮助文件并退出
       --version
              显示版本信息并退出
格式 FORMAT 控制着输出格式. 仅当选项指定为全球时间时本格式才有效。 分别解释如下:

    %%
        文本的 % 
    %a
        当前区域的星期几的简写 (Sun..Sat) 
    %A
        当前区域的星期几的全称 (不同长度) (Sunday..Saturday) 
    %b
        当前区域的月份的简写 (Jan..Dec) 
    %B
        当前区域的月份的全称(变长) (January..December) 
    %c
        当前区域的日期和时间 (Sat Nov 04 12:02:33 EST 1989) 
    %d
        (月份中的)几号(用两位表示) (01..31) 
    %D
        日期(按照 月/日期/年 格式显示) (mm/dd/yy) 
    %e
        (月份中的)几号(去零表示) ( 1..31) 
    %h
        同 %b 
    %H
        小时(按 24 小时制显示,用两位表示) (00..23) 
    %I
        小时(按 12 小时制显示,用两位表示) (01..12) 
    %j
        (一年中的)第几天(用三位表示) (001..366) 
    %k
        小时(按 24 小时制显示,去零显示) ( 0..23) 
    %l
        小时(按 12 小时制显示,去零表示) ( 1..12) 
    %m
        月份(用两位表示) (01..12) 
    %M
        分钟数(用两位表示) (00..59) 
    %n
        换行 
    %p
        当前时间是上午 AM 还是下午 PM 
    %r
        时间,按 12 小时制显示 (hh:mm:ss [A/P]M) 
    %s
        从 1970年1月1日0点0分0秒到现在历经的秒数 (GNU扩充) 
    %S
        秒数(用两位表示)(00..60) 
    %t
        水平方向的 tab 制表符 
    %T
        时间,按 24 小时制显示(hh:mm:ss) 
    %U
        (一年中的)第几个星期,以星期天作为一周的开始(用两位表示) (00..53) 
    %V
        (一年中的)第几个星期,以星期一作为一周的开始(用两位表示) (01..52) 
    %w
        用数字表示星期几 (0..6); 0 代表星期天 
    %W
        (一年中的)第几个星期,以星期一作为一周的开始(用两位表示) (00..53) 
    %x
        按照 (mm/dd/yy) 格式显示当前日期 
    %X
        按照 (%H:%M:%S) 格式显示当前时间 
    %y
        年的后两位数字 (00..99) 
    %Y
        年(用 4 位表示) (1970...) 
    %z
        按照 RFC-822 中指定的数字时区显示(如, -0500) (为非标准扩充) 
    %Z
        时区(例如, EDT (美国东部时区)), 如果不能决定是哪个时区则为空 

    默认情况下,用 0 填充数据的空缺部分. GNU 的 date 命令能分辨在 `%'和数字指示之间的以下修改.

        `-' (连接号) 不进行填充 `_' (下划线) 用空格进行填充       
        
        

参考

在设定时间方面:

date -s //设置当前时间,只有root权限才能设置,其他只能查看。
date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00
date -s 01:01:01 //设置具体时间,不会对日期做更改
date -s “01:01:01 2008-05-23″ //这样可以设置全部时间
date -s “01:01:01 20080523″ //这样可以设置全部时间
date -s “2008-05-23 01:01:01″ //这样可以设置全部时间
date -s “20080523 01:01:01″ //这样可以设置全部时间

加减:

date +%Y%m%d         //显示前天年月日
date +%Y%m%d --date="+1 day"  //显示前一天的日期
date +%Y%m%d --date="-1 day"  //显示后一天的日期
date +%Y%m%d --date="-1 month"  //显示上一月的日期
date +%Y%m%d --date="+1 month"  //显示下一月的日期
date +%Y%m%d --date="-1 year"  //显示前一年的日期
date +%Y%m%d --date="+1 year"  //显示下一年的日期

04. 参考示例

4.1 显示当前时间

[deng@redhat ~]$ date 
2019年 07月 30日 星期二 22:17:33 CST
[deng@redhat ~]$ 
[deng@redhat ~]$ date +%c
2019年07月30日 星期二 22时26分04秒
[deng@redhat ~]$ date +%D
07/30/19
[deng@redhat ~]$ date +%x
2019年07月30日
[deng@redhat ~]$ date +%T
22:26:16
[deng@redhat ~]$ date +%X
22时26分21秒
[deng@redhat ~]$ 

4.2 显示日期和设定时间

[deng@redhat ~]$ date +%c
2019年07月30日 星期二 22时29分41秒
[deng@redhat ~]$ date --date 08:42:00
2019年 07月 30日 星期二 08:42:00 CST
[deng@redhat ~]$ date +%c
2019年07月30日 星期二 22时29分57秒
[deng@redhat ~]$ date +%c --date 08:42:00 
2019年07月30日 星期二 08时42分00秒
[deng@redhat ~]$ 

4.3 显示指定的时间

[deng@redhat ~]$ date -d "nov 22"
2019年 11月 22日 星期五 00:00:00 CST
[deng@redhat ~]$ date -d "2 weeks"
2019年 08月 13日 星期二 22:31:58 CST
[deng@redhat ~]$ date -d "next monday"
2019年 08月 05日 星期一 00:00:00 CST
[deng@redhat ~]$ date -d next-day +%Y%m%d
20190731
[deng@redhat ~]$ date -d tomorrow +%Y%m%d
20190731
[deng@redhat ~]$ date -d last-day +%Y%m%d
20190729
[deng@redhat ~]$ date -d yesterday +%Y%m%d
20190729
[deng@redhat ~]$ date -d last-month +%Y%m
201906
[deng@redhat ~]$ date -d next-month +%Y%m
201908
[deng@redhat ~]$ date -d "30 days ago"
2019年 06月 30日 星期日 22:33:26 CST
[deng@redhat ~]$ date -d "-100 days"
2019年 04月 21日 星期日 22:33:36 CST
[deng@redhat ~]$ date -d "dec 14 -2 weeks"
2019年 11月 30日 星期六 00:00:00 CST
[deng@redhat ~]$ date -d "50 days"
2019年 09月 18日 星期三 22:34:00 CST
[deng@redhat ~]$ date -d now
2019年 07月 30日 星期二 22:56:49 CST

说明:

date 命令的另一个扩展是 -d 选项,该选项非常有用。使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期。-d 选项还可以告诉您,相对于当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。

具体说明如下:

date -d “nov 22” 今年的 11 月 22 日是星期三

date -d ‘2 weeks’ 2周后的日期

date -d ‘next monday’ (下周一的日期)

date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d

date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d

date -d last-month +%Y%m(上个月是几月)

date -d next-month +%Y%m(下个月是几月)

使用 ago 指令,您可以得到过去的日期:

date -d ‘30 days ago’ (30天前的日期)

使用负数以得到相反的日期:

date -d ‘dec 14 -2 weeks’ (相对:dec 14这个日期的两周前的日期)

date -d ‘-100 days’ (100天以前的日期)

date -d ‘50 days’(50天后的日期)

4.4 显示月份和日数

[deng@redhat ~]$ date '+%B %d'
七月 30
[deng@redhat ~]$ 

4.5 显示时间后跳行,再显示目前日期

[deng@redhat ~]$ date +%T%n%D
22:35:56
07/30/19
[deng@redhat ~]$ 

4.6 格式化输出

[deng@redhat ~]$ date +%Y-%m-%d
2019-07-30
[deng@redhat ~]$ 

4.7 输出昨天日期

[deng@redhat ~]$ date -d "1 day ago" +%Y-%m-%d
2019-07-29
[deng@redhat ~]$ 

4.8 2秒后输出

[deng@redhat ~]$ date -d "2 second" "+%Y-%m-%d %H:%M:%S" 
2019-07-30 22:42:41
[deng@redhat ~]$ 

4.9 传说中的 1234567890 秒

[deng@redhat ~]$ date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30
[deng@redhat ~]$ 

4.10 普通转格式

[deng@redhat ~]$ date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
2009/12/12 00:00.00
[deng@redhat ~]$ 

4.11 apache格式转换

[deng@redhat ~]$ date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
2009-12-05 00:00.37
[deng@redhat ~]$ 

4.12 格式转换后时间偏移

[deng@redhat ~]$ date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
2007-12-05 00:00.37
[deng@redhat ~]$ 

4.13 加减操作

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      //显示下一年的日期

4.14 设定时间

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"    //这样可以设置全部时间

4.15 有时需要检查一组命令花费的时间的脚本

#!/bin/bash

start=$(date +%s)
nmap man.linuxde.net &> /dev/null

end=$(date +%s)
difference=$(( end - start ))
echo $difference seconds.

4.16 按自己的格式输出

[deng@redhat ~]$ date "+神马程序员C++: %M %P 深圳"
神马程序员C++: 48 下午 深圳
[deng@redhat ~]$ 

4.17 今年已经过了多少天

[deng@redhat ~]$ date +%j
211
[deng@redhat ~]$ 

4.18 按照指定格式输出时间

[deng@redhat ~]$ date "+%F %T"
2019-07-30 22:51:04
[deng@redhat ~]$ 

4.19 显示系统的时间戳

[deng@redhat ~]$ date +%s
1564498317
[deng@redhat ~]$ 

4.20 显示UTC时间

[deng@redhat ~]$ date -u
2019年 07月 30日 星期二 14:52:59 UTC
[deng@redhat ~]$ 

4.21 显示第几周和第几天

[deng@redhat ~]$ date +%U
30
[deng@redhat ~]$ date +%j
211

4.22 显示十二小时至时间

[deng@redhat ~]$ date +%r
下午 10时54分36秒
[deng@redhat ~]$ 

4.23 显示日期

[deng@redhat ~]$ date +%F
2019-07-30
[deng@redhat ~]$ 

4.24 显示 文件的最后修改时间

[deng@redhat ~]$ date -r test.c
2019年 07月 30日 星期二 10:04:41 CST
[deng@redhat ~]$ 

4.25 生产场景中常用时间格式来打包数据

[deng@redhat ~]$ tar -czvf etc-$(date +%F).tar.gz /etc
或者
[deng@redhat ~]$ tar -czvf etc-`date +%F`.tar.gz /etc    

4.26 其它

# date -d "2015-11-15 23:00:01" 
Mon Nov 15 23:00:01 PST 2015

# date -d "2015/11/15 23:0:2" 
Mon Nov 15 23:00:02 PST 2015

# date -d "2015/11/15T23:0:2" 
Mon Nov 15 08:00:02 PST 2015

# echo "2015-11-15 23:00:01" > date.txt 
# echo "2015/11/15 23:00:02" >> date.txt 
# cat date.txt 
2015-11-15 23:00:01
2015/11/15 23:00:02

# date -f date.txt 
Mon Nov 15 23:00:01 PST 2015
Mon Nov 15 23:00:02 PST 2015

# date -r date.txt 
Mon Nov 15 21:14:36 PST 2015

# date -I 
2015-11-15

# date -Ihours 
2015-11-15T21-0800

# date -Iminutes 
2015-11-15T21:16-0800

# date -Iseconds 
2015-11-15T21:16:24-0800

# date -R 
Mon, 15 Nov 2015 21:47:08 -0800

# date -u 
Tue Nov 16 05:47:13 UTC 2015

# date +"Today is %A." 
Today is Monday.

# date +"Date:%b. %e, %G" 
Date:Nov. 15, 2015

# date +"Date: %b.%e, %G" 
Date: Nov.15, 2015

# date +"%x %X" 
11/15/2015 09:50:21 PM

# date +"%Y-%m-%d %H:%M:%S" 
2015-11-15 21:51:32

# date +"%Y-%m-%d %I:%M:%S %p" 
2015-11-15 09:51:55 PM

05. 扩展

本地时间与UTC(世界协调时间)的转换

首先我们了解一下时间的相关概念,以及之间的区别,需要了解的时间概念有:
本地时间(locale time)
格林威治时间(Greenwich Mean Time GMT)
时间协调时间 (Universal Time Coordinated UTC)
本地时间,显而易见不用解释了
先看看时间的标准:

(1)世界时
世 界时是最早的时间标准。在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104。以此标准形成的时间系统,称为世界是,即 UT1。1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初子午线的时间便被称为世界时,即UT2,或称格林威治时间 (GMT),是对地球转速周期性差异进行校正后的世界时。

(2)原子时
1967年,人们利用铯原子振荡周期极为规律的特性,研制出 了高精度的原子时钟,将铯原子能级跃迁辐射9192631770周所经历的时间定为 1s。现在用的时间就是1971年10月定义的国际原子时,是通过世界上大约200多台原子钟进行对比后,再由国际度量衡局时间所进行数据处理,得出的统 一的原子时,简称TAI。

(3)世界协调时
世界协调时是以地球自转为基础的时间标准。由于地球自转速度并不均匀,并非每天都是精确 的86400原子s,因而导致了自转时间与世界时之间存在 18个月有1s的误差。为纠正这种误差,国际地球自转研究所根据地球自转的实际情况对格林威治时间进行增减闰s的调整,与国际度量衡局时间所联合向全世界 发布标准时间,这就是所谓的世界协调时(UTC:Coordinatde Universal Time)。UTC的表示方式为:年(y)、月(m)、日(d)、时(h)、分(min)、秒(s),均用数字表示。

GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,地方时为本地时间,如北京为早上八点(东八区),UTC时间就为零点,时间比北京时晚八小时,以此计算即可
通过上面的了解,我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。

而在我们平时工作当中看到的计算机日志里面写的时间大多数是用UTC时间来计算的,那么我们该怎么将UTC时间转化为本地时间便于查看日志,那么在作程序开发时又该怎么将本地时间转化为UTC时间呢?
下面就介绍一个简单而使用的工具,就是使用linux/unix命令date来进行本地时间和local时间的转化。
大家都知道,在计算机中看到的utc时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。

06. 附录

参考:【Linux】一步一步学Linux系列教程汇总

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值