【Linux】一步一步学Linux——date命令(81)
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 2114.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 /etc4.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 PM05. 擴展
本地時間與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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】一步一步学Linux——f
- 下一篇: 【Linux】一步一步学Linux——u