00. 目录

文章目录

  • 00. 目录
  • 01. 命令概述
  • 02. 命令格式
  • 03. 常用选项
  • 04. 参考示例
  • 05. 扩展
  • 06. 附录

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/bashstart=$(date +%s)
nmap man.linuxde.net &> /dev/nullend=$(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系列教程汇总

【Linux】一步一步学Linux——date命令(81)相关推荐

  1. 学linux作用,linux有必要学吗?学linux有什么作用,学linux能干什么

    Linux是一种自由和开放源码的类UNIX操作系统.Linux有必要学吗?学Linux有什么作用,学Linux能干什么?Linux最大的作用就是提高效率.当你习惯在Linux命令行下工作,再回到win ...

  2. LINUX学习之路(学LINUX必看)

    很多同学接触Linux不多,对Linux平台的开发更是一无所知.而现在的趋势越来越表明,作为一 个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段.下来我将会结 ...

  3. linux学习需要什么基础,学linux需要什么基础?

    近几年来,随着计算机网络的发展,越来越多的人学习 linux.对于想要从事运维工作或者从事智能开发方面的同学来说,学习 linux 是必要的.linux 的学习并不简单,那么这篇文章 w3cschoo ...

  4. 分享--linux 学习之路(学linux必看)

    很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机IT行业从业人员, 掌握Linux是一种很重要的谋生资源与手段. 下来我将 ...

  5. linux参数日期加一天,详解Linux系统中的日期设定与date命令的用法

    名称 : date 使用权限 : 所有使用者 使用方式 : date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=date ...

  6. 英语不好学linux运维难吗,学Linux系统难吗?学好Linux运维需要多久

    随着近年来经济的快速发展,企业对Linux人才的需求也越来越高.许多人认为,Linux是一个非常简单的行业,然而,Linux行业是一个综合了云计算.Linux运维.Linux开发.Linux编程等多方 ...

  7. 不会linux的php难找工作,学linux系统难吗

    这是 Linux初学者经常会问的问题,其实Linux和Windows一样都属于操作系统,对于大部分人来说,对Windows操作系统十分熟悉,而对Linux操作系统没有使用过,所以觉得很难,其实,只要熟 ...

  8. linux lamp实验报告,新手学Linux--构建lamp

    本人前不久开始学习Linux,俗话说得好,好记性不如烂笔头,于是决定将平日所学所做实验,记录下来,以备回顾.由于本人是个初学者,所以借鉴了很多网上的资料,但在此处写出来的都是经过本人思考和多次实验的记 ...

  9. Linux其实没那么难学

    互联网技术总是更新迭代的,因为2020年的一场疫情,影响着中国乃至整个世界,就在这一年,网络直播,远程办公,在线教育等等的互联网产物进入了众多人的世界,当然,这其中离不开程序员的功劳. 李开复曾经说过 ...

最新文章

  1. 16-flutter-Swiper 插件的使用
  2. 022_JavaScript数字
  3. Qt中子线程创建运行时候出现QObject: Cannot create children for a parent that is in a different thread
  4. 阿里巴巴招聘最全集合帖:宣讲会+岗位+30篇面试宝典来啦
  5. 安装 paddleocr 报错 gcc: error trying to exec ‘cc1‘: execvp: 没有那个文件或目录
  6. 001Linux课程内容
  7. 建议收藏!前端工程师一线大厂面试2021总结篇(50个JS常问知识点)
  8. 谷歌这个大杀器要让英伟达慌了,实战评测:TPU相比GPU简直又快又省
  9. 中电网嵌入式系统主题月即将开幕
  10. 高频功率放大器的设计实现
  11. 五、ELK设置用户密码登陆
  12. 微信公众账号登陆授权开发——1
  13. 计算机打字在哪点,电脑打字在哪里打开
  14. java、class、jar、aar、dex、smali、apk之间的关系
  15. 在Excel中如何提取括号中的数字
  16. 用python把图片换成蓝底_详解Python给照片换底色(蓝底换红底)
  17. adb install 命令参数
  18. 雷军造车,没有“捷径”
  19. 软件工程毕设项目推荐
  20. linux电池充电阀值控制

热门文章

  1. ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
  2. iBATIS In Action:执行非查询语句(二)
  3. python pygame模块按键延迟_pygame模块中键控命令不能实现方块移动,求解
  4. C语言程序练习-L1-032 Left-pad (20分)
  5. python读取用空格分隔的文字_Python:从类似readlin的文件中读取空格分隔的字符串...
  6. Java黑皮书课后题第6章:*6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序。使用下面的方法体编写一个计算税款的方法。使用这个方法编写程序,打印可征税人从50000到60000间隔
  7. 2010年清华大学计算机研究生机试真题
  8. Jenkins任务失败,发送邮件通知
  9. 20165214 预备作业3 Linux安装及学习
  10. C++与java的不同点