Linux/Unix命令行 - 關於時間和時間戳的故事

時間是一個神奇的東西,但咱們卻僅僅用一個數字來表明它

前話

在平常開發中,長期是在從過後端服務器開發,也避免不了會常常和時間打交道,例如:後端

  • 玩家的首次登陸時間
  • 玩家的最後登陸時間
  • 活動的開啓時間和結束時間

而這些時間在程序中的表示就是用一個數字,咱們把這個數字稱爲時間戳(Timestamp)。
更多的狀況下,咱們是用一個整型數字來表示這個時間戳。瀏覽器

每個不一樣的整型數字都有不一樣的含義,他們都表明一個獨一無二的時間,例如:服務器

  • 0 : 表明 1970年的元旦節(1970.1.1 00:00:00 UTC)
  • 60 : 表明 1970年元旦節剛過一分鐘(1970.1.1 00:00:60 UTC)
  • 3600 : 表明 1970年元旦節過去一個小時了(1970.1.1 01:00:00 UTC)
  • 43200 : 表明 1970年元旦節午飯時間到了(1970.1.1 12:00:00 UTC)
  • 86400 : 表明 1970年元旦節過完了(1970.1.2 00:00:00 UTC)

結合上面的例子,對時間戳(Timestamp)的定義就清晰明瞭了,時間戳是一個數字,這個數字表明的是從1970年元旦節(1970.1.1 00:00:00)所通過(流逝)的秒數。工具

明確了這個概念,若是咱們再看到一個數字,而且知道它就是表明一個時間戳,那咱們應該會火燒眉毛的想把它轉換成它表明的時間。學習

中話

其實我只是想記錄一下Linux/Unix系統下關於date命令行工具的使用指南,不料卻回憶了一下關於時間戳的簡要概念。網站

事情的由來是,在很長一段時間內,我在拿到一個時間戳而且想看看這個時間戳到底是具體的哪一天哪一年甚至於哪一分哪一秒的時候(一般在程序出現問題須要定位和時間有關的BUG的時候)。我都會習慣性的打開某搜索引擎而後輸入時間戳這個關鍵詞進行搜索,而後熟練的點擊搜索結果的第一條Unix時間戳轉換工具,直到某一天我以爲要糾正掉這個很差的習慣,我纔開始試着去使用date這個Linux/Unix系統標配命令行工具去完成這個平常操做。哈哈,只能略表慚愧,我竟然沒有把這個這麼好用的網站給收藏到瀏覽器的頂部欄!搜索引擎

正題

時間戳 -> 日期

和往常同樣,我在調試的過程當中發現了一個可疑的時間戳,它的數值是1506787200,我須要知道這個時間戳是對應的哪一個具體日期,因此我又熟練的打開了某搜索引擎輸入了時間戳........spa

其實我此次是打開了Mac系統終端(Terminal),而後輸入了以下命令:命令行

date -r 1506787200

這個命令以最快的速度也給予了我準確的反饋輸出:
準確的輸出unix

從這一刻起,我感受我本身終於擺脫了個人壞習慣,因此我以爲有必要多操做幾回以達到強化的目的,因而我又熟練的依次輸入了以下的命令:

date -r 0
date -r 60
date -r 3600
date -r 43200
date -r 86400

這些命令如飢似渴的以最快的速度分別的給予了我準確的反饋輸出:
如飢似渴的輸出

從這一刻起,我感受我本身已經熟練掌握了date -r的奧義,就在我欣喜如狂之際,個人旁光忽然掃描到date -r 0這個命令的輸出: 1970年 1月 1日 星期四 08時00分00秒 CST,爲何是早上8時,和我在前話中提到的0表明1970年1月1日0時0分0秒有些出入呢。

其實這是一個誤會,時間戳:0確實是表明1970年1月1日0時0分0秒可是是表明零時區(UTC+0)的1970年1月1日0時0分0秒,還好我也是學過地理的,知道咱們偉大的祖國幅員遼闊,地大物博,光時區就橫跨了5個,並且全國統一使用首都北京所在時區東八區(UTC+8)的時間。

由於個人電腦系統設置的時區是東八區的緣故,這個date命令在默認狀況下也是根據系統的時區優先顯示所在時區的換算後的本地時間。以致於出現剛纔的狀況,虛驚一場。

爲了驗證剛纔的推論,我打算從新操做一次,而且加上了一個神祕的參數-u,這個參數的做用很簡單,就是以零時區(UTC+0)爲標準輸出時間,輸入的命令以下:

date -u -r 0
date -u -r 60
date -u -r 3600
date -u -r 43200
date -u -r 86400

這些命令欣慰的以最快的速度分別的給予了我預料中的反饋輸出:
欣慰的輸出

從這一刻起,雖然我感受到個人功力再次上了一個臺階,但在這個時候我以爲我應該稍微停頓一下個人腳步,來追憶一下往昔的時光。

很快我就進入了狀態,回想起1998年的那個夏天,7月13日的凌晨3點,法蘭西世界盃決賽法國VS巴西,一個讓多少人睡不着覺的夜晚,但倒是我第一次嘗試在這麼晚的時間或者說那麼早的時間去看一場足球比賽,是由於在這以前我還一直是一名做息時間規律的小學生。回憶到此,我以爲我應該作點什麼,我竟然想查看一下那個快20年以前的夜晚的時間戳!

日期 -> 時間戳

因而我飛快的將這個熟悉又遙遠的日期輸入到命令中:

date -j 071303001998

命令給予了一個輸出:

1998年 7月13日 星期一 03時00分00秒 CST
#法蘭西世界盃決賽開始的北京時間

上面的命令中,我輸入的是date -j 071303001998,其中的-j參數表明的是不要將他後面的那個日期字符串設置爲當前系統時間,而只是將它以更友好的1998年 7月13日 星期一 03時00分00秒 CST這種形式輸出。簡單點說也就是若是我不加-j參數,那麼date 071303001998命令會直接把個人電腦系統的當前時間設置爲1998年那個夏天的7月13日凌晨3點,而不是在屏幕上輸出那個時間。

可是我提供的071303001998這個字符串其實就是月日時分年的格式,07是7月,13是13日,03是凌晨3點,00是0分,1998是什麼還用說麼,我知道準確的日期,而後輸入到這個date -j 071303001998命令中,顯然不是爲了讓它輸出告訴我1998年 7月13日 星期一 03時00分00秒 CST這個只是更好讀的一樣的日期,我是出於強烈的好奇想要知道這個偉大的時間的時間戳,因此我必須還要動點手腳:

date -j 071303001998 +%s

此次的命令只輸出了一個數字,這個數字就是我想知道的那個時間戳:

900270000

獲得了時間戳,我又火燒眉毛的使用以下命令:

date -r 900270000

命令再一次的快速輸出了:

1998年 7月13日 星期一 03時00分00秒 CST

通過這一些列的操做,我不光學習到了新的參數-j,還再次溫故了-r參數的用法,更重要的是我完成了對過往美好時光的追憶,可謂一石三鳥,大快人心。

格式化

前面的命令雖然用得很溜了,可是它們的輸出都略顯冗長,雖然很智能的根據我是中文用戶給予了中文輸出的最高待遇,但我以爲很普通~ 我如今迫切的但願改變它的輸出的格式以彰顯我獨特的個性與品味,因而我又開始了個人操做,我如今顯然還沉浸在剛在的追憶中,因此我仍是打算用900270000這個表明1998年夏天的7月13日凌晨3點整的這個有特殊意義的時間戳來完成個人操做:

date -r 900270000 +%Y

它給予了我一個簡單輸出做爲迴應:

1998

我有些小激動,彷彿找到一些竅門,繼續輸入:

date -r 900270000 +%m

它再次給予了我一個更簡潔的迴應:

07

我更加激動,堅決果斷的輸入:

date -r 900270000 +%d

它果真沒有讓我失望,給予了我預料中的迴應:

13

通過三次嘗試,我嚐到了成功的滋味,我以爲這個時候應該乘勝追擊,因而我決定將%Y,%m,%d放在一塊兒,個人第六感告訴我,我會再次得到成功:

date -r 900270000 +%Y%m%d

結果顯而易見,年月日一塊兒出如今了屏幕上:

19980713

我還不知足,我想獲取更多的成就感,我想輸出的格式更加的國際化,我繼續嘗試:

date -r 900270000 +%m/%d/%Y

結果達到個人初步要求:

07/13/1998

我依然不知足,由於我想起了王菲和那英所唱的那首紅遍大江南北的歌曲《相約98》,我以爲我也要顯示98而不是1998,在那個年代,沒有人會說1998年,因此我再次摸索並嘗試:

date -r 900270000 +%m/%d/%y

大寫變小寫,腐朽化神奇:

07/13/98

我果真仍是不知足,內心想着若是能在後面附加上具體的時間那我應該就會收手了,因而我又一鼓作氣的輸入了以下命令:

date -r 900270000 +%m/%d/%y %H:%M:%S

內心想着就快完成此次愉快的操做之旅時,現實卻讓我嚐到了失敗的味道:

date: illegal time format

在最後關頭竟然發生了意外着實讓我有些不太爽快,可是憑藉我大學英語四級的紮實基礎,我仍是從報錯信息中領悟出了一些端倪,再結合我多年的工做經驗,我感受應該是我新增長的那段爲了輸出時分秒的格式字符串%H:%M:%S所形成的。我隱約感受到應該是它以前的那個空格致使了date命令在讀取的時候誤覺得它們是兩個獨立的字符串。這種時候,按照慣例應該須要用傳說中的雙引號""將它們包圍在一塊兒,以表示它們是一個總體。因而我從新整理了命令:

date -r 900270000 "+%m/%d/%y %H:%M:%S"

此次終於能夠收工了,完美的輸出,完美的夜晚,再也回去不的98:

07/13/98 03:00:00

作個總結

經常使用命令行

  • date
    默認格式輸出當前日期。
  • date +%Y%m%d%H%M%S
    自定義格式%Y%m%d%H%M%S輸出當前日期
  • date -r 900270000
    默認格式輸出時間戳:900270000對應日期
  • date -r 900270000 +%Y%m%d%H%M%S
    自定義格式%Y%m%d%H%M%S輸出時間戳:900270000對應日期
  • date -j 071303001998
    默認格式輸出日期字符串:071303001998對應的日期
  • date -j 071303001998 +%Y%m%d%H%M%S
    自定義格式%Y%m%d%H%M%S輸出日期字符串:071303001998對應的日期
  • date -j 071303001998 +%s
    自定義格式%s輸出日期字符串:071303001998對應的日期的時間戳

格式字符串含義

注意大小寫表明徹底不一樣的含義

  1. %Y : 年(Year)
  2. %y : 年(year)後兩位
  3. %m : 月(month)
  4. %d : 日(day)
  5. %H : 時(Hour)
  6. %M : 分(Minute)
  7. %S : 秒(Second)
  8. %s : 時間戳(stamp)

日期字符串默認格式

月日時分年(07 13 03 00 1998)

那些逝去的時間戳

  • 900270000
  • 1157040000
  • 967737600
  • 778348800
  • 555087600
  • 1430136000
  • 1461758400
  • 1493222400
  • 1277913600
相關文章
相關標籤/搜索