使用fecha來幫你進行JS日期處理

在日常項目中匹摇,經常會碰到日期處理的需求,這種需求千奇百怪甲葬,而且往往經常變化廊勃。雖然js提供了原生的Date方法供我們選擇,但一些復雜的日期時間處理起來往往力不從心演顾。

目前在項目中我們使用了fecha來進行日期處理供搀,并對fecha進行了重新封裝,滿足項目中的實際需求。

fecha

fecha是一個日期格式化和解析的js庫钠至,它提供了強大的日期處理功能葛虐,功能強大且只有2k大小。安裝方式簡單棉钧,只需要npm install fecha --save即可

Formatting(日期格式化)

fecha提供一個format方法屿脐。fecha.format接收一個Date對象(或一個時間戳)和一個字符串形式的日期格式,然后返回一個字符串(處理后的日期)宪卿。

注意: 當傳入的參數無效時的诵,fecha會報錯

fecha.format(<Date Object>, <String Format>);

// 自定義格式化
// string format可以傳入自定義的格式,fecha會返回相應的格式
fecha.format(new Date(2015, 10, 20), 'dddd MMMM Do, YYYY'); // 'Friday November 20th, 2015'
fecha.format(new Date(1998, 5, 3, 15, 23, 10, 350), 'YYYY-MM-DD hh:mm:ss.SSS A');// '1998-06-03 03:23:10.350 PM'

// 通過自定義的常量來設置日期格式
fecha.format(new Date(2015, 10, 20), 'mediumDate');// 'Nov 20, 2015'
fecha.format(new Date(2015, 2, 10, 5, 30, 20), 'shortTime');// '05:30'

// 添加一些其他常量
fecha.format(new Date(2001, 2, 5, 6, 7, 2, 5), '[on] MM-DD-YYYY [at] HH:mm'); // 'on 03-05-2001 at 06:07'

這樣我們就可以很容易的處理new Date() → 2016年11月19日這樣的需求了

fecha.format(new Date(), 'YYYY[年]MM[月]DD[日]')

Parsing(日期解析)

fecha另外提供了一個parse方法佑钾。和format類似西疤,fecha.parse接收一個Date字符串和一個字符串形式的日期格式,然后返回一個Date對象休溶。

注意: 當傳入的參數無效時代赁,fecha會報錯

// 自定義格式化
formatsfecha.parse('February 3rd, 2014', 'MMMM Do, YYYY'); // new Date(2014, 1, 3)
fecha.parse('10-12-10 14:11:12', 'YY-MM-DD HH:mm:ss'); // new Date(2010, 11, 10, 14, 11, 12)

// 通過自定義的常量來設置日期格式

fecha.parse('5/3/98', 'shortDate'); // new Date(1998, 4, 3)
fecha.parse('November 4, 2005', 'longDate'); // new Date(2005, 10, 4)

自定義命名常量

fecha.masks = {
    'default': 'ddd MMM DD YYYY',
    shortDate: 'M/D/YY',
    mediumDate: 'MMM D, YYYY',
    longDate: 'MMMM D, YYYY',
    fullDate: 'dddd, MMMM D, YYYY',
    shortTime: 'HH:mm',
    mediumTime: 'HH:mm:ss',
    longTime: 'HH:mm:ss.SSS'
};

國際化支持(拓展)

在實際使用中,我們會碰到很本土化的需求兽掰,比如要設置“周一”“星期二”“星期一啦”這種奇怪的需求芭碍,或者周一需要設置成“月曜日”,周二要設置成“火曜日”等等

這些需求我們都可以通過在parse和format方法中提到過的i18n支持來實現(xiàn)孽尽。

通過在fecha.i18n中修改對應的設置即可窖壕。

fecha.i18n = {
    dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
    dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
    monthNamesShort: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
    monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
    amPm: ['上午', '下午'],
    // D is the day of the month, function returns something like...  3rd or 11th
    DoFn: function (D) {
        return D + [ 'th', 'st', 'nd', 'rd' ][ D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10 ];
    }
}

Formatting Tokens

Formatting Tokens

對fecha的再次封裝

在實際需求中,我們還會遇到各種亂七八糟的需求

2016-11-20 → 明天 11-20
2016-11-23 → 下周三 11-23
10:00 加上100分鐘的時間
...

雖然fecha提供了一些很實用的日期處理方法杉女,但在千奇百怪的需求下瞻讽,我么還是需要對fecha進行再封裝,來滿足實際需要熏挎。而且通過對fecha的封裝速勇,抽離成公用組件,也避免了多個頁面多次進行i18n配置和masks的設置婆瓜。頁面調用時也更加方便快集。

一個封裝后的fecha公共組件示例

import fecha from 'fecha'

fecha.i18n = {
    dayNamesShort: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],
    dayNames: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],
    monthNamesShort: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
    monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
    amPm: ['上午', '下午'],
    // D is the day of the month, function returns something like...  3rd or 11th
    DoFn: function (D) {
        return D + [ 'th', 'st', 'nd', 'rd' ][ D % 10 > 3 ? 0 : (D - D % 10 !== 10) * D % 10 ];
    }
}

fecha.masks = {
    'default': 'ddd MMM DD YYYY',
    shortDate: 'M/D/YY',
    mediumDate: 'MMM D, YYYY',
    longDate: 'MMMM D, YYYY',
    fullDate: 'dddd, MMMM D, YYYY',
    shortTime: 'HH:mm',
    mediumTime: 'HH:mm:ss',
    longTime: 'HH:mm:ss.SSS'
};  
// str 必須是 YYYYMMDD格式
// YYYYMMDD → xx(今天/后天/下周一...)MM月DD日
fecha.getDateString = (str, format) => {
    let now = Date.now();
    let today = fecha.format.bind(null, new Date());
    let tomorrow = fecha.format.bind(null, new Date(now + 86400 * 1000));
    let dayafter = fecha.format.bind(null, new Date(now + 86400 * 2 * 1000));

    let week_start = parseInt(today('d'));

    let result = {};
    // 從本周一到下周日共14個
    let weeks = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
    result[today(YYYYMMDD)] = `今天 ${today('MM')}月${today('DD')}日`;
    result[tomorrow(YYYYMMDD)] = `明天 ${tomorrow('MM')}月${tomorrow('DD')}日`;
    result[dayafter(YYYYMMDD)] = `后天 ${dayafter('MM')}月${dayafter('DD')}日`;

    weeks.slice(week_start + 3).forEach((after) => {
        let step = after - week_start;
        let _dayafter = fecha.format.bind(null, new Date(now + 86400 * step * 1000));
        result[_dayafter(YYYYMMDD)] = `${(after < 8 ? '本' : '下')}${_dayafter('ddd')}  ${_dayafter('MM')}-${_dayafter('DD')}`;
    })
    // 如果出現(xiàn)下下周一的情況則輸出調用時傳入的格式規(guī)范
    return result || format(fecha.parse(str, YYYYMMDD), format)
}

export default fecha

當其他頁面需要使用日期處理時,只需要在頁面調用fecha組件即可廉白。

import DateParser from 'fecha'

...
  let date = DateParser.getDateString('20161123', 'YYYY-MM-DD')
...

當現(xiàn)有日期處理不能解決實際需要時个初,只需要在fecha組件中自行添加方法。寫好注釋猴蹂,后續(xù)同事開發(fā)相同功能時即可直接調用院溺,提高了團隊了效率。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末磅轻,一起剝皮案震驚了整個濱河市珍逸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聋溜,老刑警劉巖谆膳,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撮躁,居然都是意外死亡漱病,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門把曼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杨帽,“玉大人,你說我怎么就攤上這事嗤军∽⒂” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵叙赚,是天一觀的道長老客。 經常有香客問我,道長纠俭,這世上最難降的妖魔是什么沿量? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮冤荆,結果婚禮上朴则,老公的妹妹穿的比我還像新娘。我一直安慰自己钓简,他們只是感情好乌妒,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著外邓,像睡著了一般撤蚊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上损话,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天侦啸,我揣著相機與錄音槽唾,去河邊找鬼。 笑死光涂,一個胖子當著我的面吹牛庞萍,可吹牛的內容都是我干的。 我是一名探鬼主播忘闻,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼钝计,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了齐佳?” 一聲冷哼從身側響起私恬,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炼吴,沒想到半個月后本鸣,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡硅蹦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年永高,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提针。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡命爬,死狀恐怖,靈堂內的尸體忽然破棺而出辐脖,到底是詐尸還是另有隱情饲宛,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布嗜价,位于F島的核電站艇抠,受9級特大地震影響,放射性物質發(fā)生泄漏久锥。R本人自食惡果不足惜家淤,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瑟由。 院中可真熱鬧絮重,春花似錦、人聲如沸歹苦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殴瘦。三九已至狠角,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚪腋,已是汗流浹背丰歌。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工姨蟋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人立帖。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓芬探,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厘惦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容

  • SwiftDate概況 從Swift發(fā)布起哩簿,我們就沒有放棄使用Swift宵蕉。 當然,我們希望在項目能夠輕松自如地管理...
    Mee_Leo閱讀 10,033評論 1 13
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理节榜,服務發(fā)現(xiàn)羡玛,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,841評論 25 707
  • 今天老板找我談話 說我最近寫的稿子不夠文藝 應該多接觸社會 不能閉門造車 只是看書是不行的 下班別總直接回家 去逛...
    duangduang飛閱讀 340評論 1 1
  • 看了自己第一階段的總結,我覺得那時候的自己讳窟,做的真的很棒让歼。學了很多,做了很多丽啡,也感悟了很多谋右。還是要感嘆時間過得真快...
    錢鋒閱讀 172評論 0 0