moment過重? 那就試試miment--一個超輕量級的js時間庫

介紹

Miment 是一個輕量級的時間庫(打包壓縮後只有1K),沒有太多的方法, Miment的設計理念就是讓你以幾乎爲零的成本快速上手,無需一遍一遍的擼文檔前端

由來

首先 致敬一下Moment,很是好用的一個時間庫,我自己也是Moment重度使用者,用習慣了Moment, 一碰到須要處理時間的需求,立馬Moment,不過有時候想一想,Moment給咱們提供了那麼多的功能,可是咱們每天用的, 也就那麼一兩個,恰好最近在寫微信小程序,而後在頁面引入Moment,打包完,包居然大了200多K,把Moment去掉, 就直接少掉200多K,反覆試了好幾回,肯定一個Moment在小程序裏面,佔用大概200K的空間,因而就想本身寫一個相似 Moment的精簡的時間庫,因而就有了這個,爲何要叫Miment呢,其實剛開始我是想叫Mini-Moment的, 可是考慮到之後可能會常用到,打2個單詞中間還要加一個下劃線太累了,因此就把Mini-Moment縮水成Miment了。node

開始使用

若是你是直接在瀏覽器裏面使用,請下載./dist/miment-min.js到你的項目裏面去,而後在頁面引入後便可直接使用mimentgit

<script src='你js存放的目錄/miment-min.js'> </script>
<script>
    miment().format()  //  2018-04-09 23:01:58 這是我寫這篇文檔的時候,運行代碼顯示的時間
</script>
複製代碼

若是你是在單頁面應用或者nodejs環境下使用,首先你須要使用安裝一下Mimentgithub

npm i miment
複製代碼

或者npm

yarn add miment
複製代碼

而後就能夠在你的項目中使用了json

import miment from 'miment'
miment().format()
複製代碼

API

你也能夠猛戳這裏看example小程序

API 分爲3大類後端

第一類是返回其餘對象的,好比format,返回的是字符串 json返回的是一個josn微信小程序

第二類是返回miment對象的,你能夠在調完一個api後面繼續調用另外一個api,也就是咱們所說的鏈式調用api

第三類是從Date對象繼承的,也就是說Date對象有的方法,miment也一樣有,該類方法建議儘可能少用

第一類

  1. format 格式化時間 ,format方法也就是咱們平時最經常使用的一個了,他一共接收2個參數,這2個參數都有默認值,不傳就使用默認值

    參數名稱 參數類型 參數默認值 是否必傳 說明
    格式化的字符串 string 'YYYY-MM-DD hh:mm:ss' N 年YYYY,月MM,日DD,時hh,分mm,秒ss,毫秒SSS,數字星期ww,中文星期WW
    是不是格式化一個時間差 boolean false N 好比你要計算的時間是一個倒計時,這個時候也就須要傳true

    本着簡單的原則,這裏格式化方式沒有作的太靈活,有時候靈活也是一種學習成本,由於你須要記不少的用法,不是嗎?, 注意格式化字符串區分大小寫,記的技巧是大的單位大寫 YYYY MM DD,小的單位小寫 hh mm ss 毫秒跟星期特殊的單獨記, 參數必須嚴格按照說明裏面的填寫,多一個或者少一個都認不到,好比YYYY寫成YYY或者YY這樣是識別不了的

    第二個參數的用法能夠參考 distance函數

    示例

    miment().format('YYYY年MM月DD日 hh:mm:ss')  // 2018-04-09 23:49:36
     miment().format('YYYY/MM/DD hh-mm-ss SSS') // 2018/04/09 23-49-36 568
     miment().format('YYYY年MM月DD日 星期WW')     // 2018年04月09日 星期一
     miment().format('YYYY年MM月DD日 星期ww')     // 2018年04月09日 星期1 (星期日這邊會顯示星期0)
    複製代碼

    擴展一下,若是咱們只是想獲取年份或者月份或者日,能夠這樣用

    miment().format('YYYY')   // 2018
     miment().format('MM')     // 04
     miment().format('DD')     // 09
     miment().format('hh')     // 23
     miment().format('mm')     // 57
     miment().format('ss')     // 16
     miment().format('SSS')    // 063
     miment().format('ww')     // 1
     miment().format('WW')     // 一
    複製代碼

    因此,有了這個方法,其實你能夠不須要去記大部分原生的方法(getFUllYear,getDate,getDay...),全部的需求一個format搞定, 這就是咱們追求的極簡,固然,也會有一丟丟的性能損失,不過我的以爲對於當今的硬件設備,你徹底能夠忽略這一點點性能。除非你的項目很特殊。

  2. json 輸出json格式的時間,不須要參數

    直接上代碼

    miment().json()
    複製代碼

    看輸出

    {
         "year": 2018,
         "month": 4,
         "date": 11,
         "hour": 8,
         "minute": 57,
         "second": 41,
         "day": 3,
         "milliSecond": 87
     }
    複製代碼

    輸出內容比較簡單,應該很好理解,這裏就不對輸出作介紹了,day返回的是星期幾,從0-星期天 1-星期一,以此類推

  3. stamp 輸出時間戳,不須要參數

    miment().stamp()
    複製代碼

    看輸出

    1523408529932
    複製代碼

    會輸出一串表明當前時間的數字,這個對前端基本沒啥用,不過有時候後端的同窗會要求傳這個

  4. daysInMonth 獲取當前月的天數,不須要參數

    miment().daysInMonth()   // 30
    複製代碼

第二類

  1. add 增長或減小時間,它接收2個參數

    參數名稱 參數類型 參數默認值 是否必傳 說明
    增量 number 0 N 要增長的時間量,增長傳正數,減小傳負數
    增量單位 string 無默認值 Y 要增長的時間單位,可選有YYYY MM DD hh mm ss SSS ww WW

    單位 的可選參數跟格式化方法format的相似,這麼作也是爲了方便記憶,只須要記一套方案

    一樣地 單位也區分大小寫,記的技巧是大的單位大寫 YYYY MM DD,小的單位小寫 hh mm ss 毫秒跟星期特殊的單獨記, 參數必須嚴格按照說明裏面的填寫,多一個或者少一個都認不到,好比YYYY寫成YYY或者YY這樣是識別不了的

    miment().add(1,'DD')  // 增長一天
     miment().add(1,'YYYY').add(2,'MM').add(-3,'DD')  // 增長1年2個月又減回去3天
     miment().add(-1,'ww')  // 減去一週 --即獲取上週的日期
     miment().add(500,SSS)  // 增長500毫秒
    複製代碼

    add返回的值是增長完後的miment對象,因此咱們能夠在它後面繼續調用miment有的方法。

    miment().add(1,'DD').format()   // 我測試的時候,打印的是 2018-04-12 09:29:55
    複製代碼

    須要注意的是,當你調完第一類的方法之後,返回的就不是miment對象了,好比format返回的是一個字符串,這個時候你就不能再調用miment上的方法了, 會報錯 Uncaught TypeError: miment(...).format(...).xxx is not a function 由於字符串的原型上面沒有這個方法

    miment().add(1,'DD').format().add(1,'DD')  // 報錯
    複製代碼
  2. distance 計算2個時間的距離 接收2個參數,返回一個miment對象

    參數名稱 參數類型 參數默認值 是否必傳 說明
    起始時間 miment/date/number/string Y 接受4種類型參數,會自動轉換
    結束時間 miment/date/number/string N 同上

    只傳一個起始時間的時候,返回 起始時間 - miment當前時間

    起始時間和結束時間都有傳的時候,返回 起始時間 - 結束時間

    miment().distance('2018-04-10 00:00:00')  // Mon Dec 29 1969 22:11:51 GMT+0800 (CST)
     miment().distance(1523408529932)          // Wed Dec 31 1969 07:13:47 GMT+0800 (CST)
    
     miment().distance('2018-04-10 00:00:00', new Date())  //Mon Dec 29 1969 22:11:13 GMT+0800 (CST)
     miment().distance('2018-04-10 00:00:00', '2018-04-11 00:00:00')  //Mon Dec 29 1969 22:10:46 GMT+0800 (CST)
    複製代碼

    你必定注意到了,distance方法返回的時間,居然都是1969年的? 這其實是基於1970-01-01 00:00:00的一個毫秒數, 具體請看 百度百科-unix時間, 而咱們把兩個時間相減,獲得的多是一個相對來講很小的數(還有多是負數),因此離1970很近

    那咱們要怎麼顯示咱們能看得懂的時間呢? 很簡單 用格式化時間函數format,還記得format函數的第二個參數嗎? 就是專門用來格式化distance計算出來的時間差,只要把第二個參數設爲true,就能把當前時間格式化成時間差 咱們先來看看第二個參數不傳,或者傳false的時候是什麼樣子的

    miment().distance(1523408529932).format('YYYY年MM月DD日 hh時mm分ss秒')        // 1969年12月30日 00時52分16秒
     miment().distance(1523408529932).format('YYYY年MM月DD日 hh時mm分ss秒',false)  // 1969年12月30日 00時52分16秒
    複製代碼

    而後咱們把第二個參數設爲true

    miment().distance(1523408529932).format('YYYY年MM月DD日 hh時mm分ss秒',true)  // 00年01月03日 23時08分23秒
    複製代碼
  3. firstDayOfWeek 獲取 本週的第一天(週日) 不須要參數

    miment().firstDayOfWeek()           // Sun Apr 08 2018 11:27:55 GMT+0800 (CST)
       miment().firstDayOfWeek().format()  // 2018-04-08 11:27:55
    複製代碼

    若是想獲取週一呢?周2、3、4、5、六呢?

    miment().firstDayOfWeek().add(1,'DD').format() // 2018-04-09 11:27:55
    複製代碼
  4. firstDay 獲取每月的第一天 不須要參數

    miment().firstDay()           // Sun Apr 01 2018 00:00:00 GMT+0800 (CST)
     miment().firstDay().format()  // 2018-04-01 00:00:00
    複製代碼
  5. lastDay 獲取每月的最後一天 不須要參數

    miment().lastDay()           // Mon Apr 30 2018 00:00:00 GMT+0800 (CST)
     miment().lastDay().format()  // 2018-04-30 00:00:00
    複製代碼

第三類

  1. Date自帶方法 miment繼承自Date對象,因此也擁有Date對象的全部方法,這裏就不作深刻講解,須要更多關於Date對象的說明, 請移步至MDN查看

    不過須要注意的是,因爲繼承而來的方法是屬於Date對象的,爲了保持一致,咱們沒有去對方法作改動,因此方法沒法返回miment對象,也就是說沒法鏈式調用miment

寫在最後

目前這些功能(函數),是咱們團隊在平常實踐中碰到的比較經常使用的,若是你對功能有新的需求或者建議, 歡迎給咱們提Issue,若是喜歡miment, 請在個人github上給我一個star,你的star就是我最大的動力了,謝謝!

相關文章
相關標籤/搜索