Moment.js中時(shí)間比較isSame()方法詳解
一、方法簡(jiǎn)介
isSame()
是 Moment.js 中用于比較兩個(gè)時(shí)間點(diǎn)是否相同的方法。它支持按不同時(shí)間單位(年、月、日、小時(shí)等)進(jìn)行精度可控的對(duì)比,是處理時(shí)間比較場(chǎng)景的核心工具。
二、方法語(yǔ)法
momentObj.isSame(compareMoment[, unit][, preciseMode]);
參數(shù)說(shuō)明
參數(shù) | 類型 | 必填 | 說(shuō)明 |
---|---|---|---|
compareMoment | Moment/Date/string | 是 | 要比較的時(shí)間對(duì)象 |
unit | string | 否 | 比較精度單位(默認(rèn)毫秒級(jí)) |
preciseMode | boolean | 否 | 是否嚴(yán)格模式(v2.13.0+) |
三、核心功能解析
1. 基礎(chǔ)比較
不指定單位時(shí)進(jìn)行毫秒級(jí)精確比較:
const a = moment('2023-08-20 10:00:00'); const b = moment('2023-08-20 10:00:00.001'); console.log(a.isSame(b)); // false(相差1毫秒)
2. 按單位比較
通過第二個(gè)參數(shù)指定比較精度:
單位值 | 等價(jià)條件 | 示例 |
---|---|---|
year | 同年 | 2023-01-01 vs 2023-12-31 → true |
month | 同月 | 2023-08-01 vs 2023-08-31 → true |
day | 同日 | 2023-08-20 00:00 vs 2023-08-20 23:59 → true |
hour | 同小時(shí) | 14:00:00 vs 14:59:59 → true |
minute | 同分鐘 | 10:30:00 vs 10:30:59 → true |
second | 同秒 | 10:30:15.000 vs 10:30:15.999 → true |
示例代碼:
const date1 = moment('2023-08-20 14:30:00'); const date2 = moment('2023-08-20 14:45:00'); console.log(date1.isSame(date2, 'hour')); // true(同一小時(shí)) console.log(date1.isSame(date2, 'minute')); // false(不同分鐘)
四、高級(jí)用法
1. 嚴(yán)格模式(preciseMode)
v2.13.0+ 新增參數(shù),控制是否包含更小單位:
const d1 = moment('2023-08-20'); const d2 = moment('2023-08-20 14:00'); // 常規(guī)模式 console.log(d1.isSame(d2, 'day')); // true // 嚴(yán)格模式 console.log(d1.isSame(d2, 'day', true)); // false
2. 跨時(shí)區(qū)比較
必須統(tǒng)一時(shí)區(qū)后再比較:
const utcTime = moment.utc('2023-08-20T12:00:00'); const localTime = moment('2023-08-20T20:00:00+08:00'); // 錯(cuò)誤方式 console.log(utcTime.isSame(localTime, 'day')); // false(時(shí)區(qū)不同) // 正確方式 console.log(utcTime.local().isSame(localTime, 'day')); // true
五、性能對(duì)比
與格式化字符串比較的差異
// 方法1:isSame() moment().isSame(otherDate, 'day'); // 方法2:字符串比較 moment().format('YYYY-MM-DD') === otherDate.format('YYYY-MM-DD');
基準(zhǔn)測(cè)試結(jié)果(100萬(wàn)次比較):
方法 | 耗時(shí)(ms) |
---|---|
isSame | 120ms |
字符串比較 | 450ms |
六、常見問題
Q1:如何判斷是否在同周?
moment().isSame(otherDate, 'isoWeek');
Q2:如何比較季度?
需要自定義處理:
function isSameQuarter(a, b) { return a.quarter() === b.quarter() && a.isSame(b, 'year'); }
Q3:日期對(duì)象自動(dòng)轉(zhuǎn)換
支持自動(dòng)轉(zhuǎn)換 Date 對(duì)象和 ISO 字符串:
const jsDate = new Date(); moment().isSame(jsDate); // 直接比較 const isoStr = '2023-08-20T00:00:00Z'; moment().isSame(isoStr, 'day'); // 自動(dòng)解析
七、最佳實(shí)踐
- 始終顯式指定單位:避免毫秒級(jí)比較的意外結(jié)果
- 時(shí)區(qū)先統(tǒng)一后比較:使用 .utc() 或 .local() 轉(zhuǎn)換
- 處理用戶輸入時(shí)校驗(yàn)格式:防止無(wú)效日期導(dǎo)致的異常
- 結(jié)合其他方法使用:如 isBefore + isSame 判斷時(shí)間范圍
八、總結(jié)
isSame() 是 Moment.js 時(shí)間比較的瑞士軍刀,其核心優(yōu)勢(shì)在于:
? 靈活的時(shí)間粒度控制
? 自動(dòng)類型轉(zhuǎn)換能力
? 高性能的比較實(shí)現(xiàn)
盡管 Moment.js 已進(jìn)入維護(hù)狀態(tài),但在存量項(xiàng)目中合理使用 isSame() 仍然是處理時(shí)間比較最高效的方式。
到此這篇關(guān)于Moment.js中時(shí)間比較isSame()方法的文章就介紹到這了,更多相關(guān)Moment.js isSame()方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
scrapyd schedule.json setting 傳入多個(gè)值問題
這篇文章主要介紹了scrapyd schedule.json setting 傳入多個(gè)值,本文給出了問題分析及思路解決方案,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-08-08JS判斷不同分辨率調(diào)用不同的CSS樣式文件實(shí)現(xiàn)思路及測(cè)試代碼
最近看一個(gè)網(wǎng)站,發(fā)現(xiàn)顯示器不同的分辨率,樣式文件調(diào)用的也不一樣,于是很好奇研究并寫了一個(gè),經(jīng)測(cè)試感覺還不錯(cuò),感興趣的你可以來(lái)看看哦2013-01-01JavaScript設(shè)計(jì)模式之工廠方法模式介紹
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之工廠方法模式介紹,本文講解了簡(jiǎn)單工廠模式、多個(gè)工廠方法模式等內(nèi)容,需要的朋友可以參考下2014-12-12微信公眾號(hào)JS-SDK獲取當(dāng)前經(jīng)緯度以及地址信息的方法
最近微信JS-SDK開發(fā)過程中,遇到了獲取坐標(biāo)位置的需求,所以下面這篇文章主要給大家介紹了關(guān)于微信公眾號(hào)JS-SDK獲取當(dāng)前經(jīng)緯度以及地址信息的相關(guān)資料,需要的朋友可以參考下2022-06-06一步步教你利用Canvas對(duì)圖片進(jìn)行處理
這篇文章主要給大家介紹了關(guān)于利用Canvas對(duì)圖片進(jìn)行處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09解決Jstree 選中父節(jié)點(diǎn)時(shí)被禁用的子節(jié)點(diǎn)也會(huì)選中的問題
下面小編就為大家分享一篇解決Jstree 選中父節(jié)點(diǎn)時(shí)被禁用的子節(jié)點(diǎn)也會(huì)選中的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2017-12-12javascript中全局對(duì)象的isNaN()方法使用介紹
全局對(duì)象的isNaN()方法通常用于檢測(cè) parseFloat() 和 parseInt() 的結(jié)果,下面為大家介紹下其具體的使用,感興趣的朋友可以參考下2013-12-12