moment 常用api

847 阅读6分钟

日常开发经常会用Moment.js来处理时间,现对频繁使用的几个API做下整理,以便日后查阅

安装

npm install moment

获取时间

moment().valueOf()  // 获取时间戳(以毫秒为单位) 

moment().startOf('day')   // 获取今天0时0分0秒
moment().startOf('isoWeek')  // 获取本周周一0时0分0秒
moment().startOf('month')  // 获取本月第一天0时0分0秒

moment().endOf('day')   // 获取今天23时59分59秒
moment().endOf('isoWeek')  // 获取本周周日23时59分59秒
moment().endOf('month')   // 获取本月最后一天23时59分59秒

moment().year()       //   获取当前年份
moment().month()   //   获取当前月( 0~11, 0 =>1月, 11=>12月)
moment().date()     //  获取今天
moment().day()      // 获取当前星期 (0~6, 0: 周日, 6: 周六)

moment().daysInMonth()  // 获取本月的总天数

moment().month(moment().month() - 1).startOf('month').valueOf()   //  上个月1号的00:00:00
moment().month(moment().month() - 1).endOf('month').valueOf()    //  上个月最后一天的23:59:59

moment().month(moment().month() - 1).startOf('month').valueOf()   //  上个季度第一个月1号的00:00:00
moment().month(moment().month() - 1).endOf('month').valueOf()    //  上个季度最后一个月最后一天的23:59:59

//时间增加
moment().add(4, 'years').format('YYYY-MM-DD'); //2024-03-24
moment().add(4, 'months').format('YYYY-MM-DD'); //2020-07-24
moment().add(4, 'days').format('YYYY-MM-DD'); //2020-03-28
moment([2016]).add(4, 'years').format('YYYY'); //2020
//时间减少
moment().subtract(10, 'years').format('YYYY'); //2010
//设置为时间单位的开头对时间进行更改
moment().startOf('hour').format('YYYY-MM-DD HH:mm:ss'); //2020-03-24 15:00:00
//设置为时间单位的末尾对时间进行更改
moment().endOf('hour').format('YYYY-MM-DD HH:mm:ss'); //2020-03-24 15:59:59

格式化时间

moment().format('YYYY-MM-DD')
moment().format('HH:mm:ss')  // 格式化时分秒(24小时制 注意HH非hh)
moment().format('hh:mm:ss a')  // 格式化时分秒(12小时制)
moment().format('x')    // 格式化时间戳(以毫秒为单位)
moment().format('X')    // 格式化时间戳(以秒为单位)

//moment().format(String)
moment().format(); //moment 2020-03-23T18:20:11+08:00
//年份
moment().format('YYYY'); //2020
//季度
moment().format('Q'); //1
//月份
moment().format('MMMM'); //March
//月份的日期
moment().format('DD'); //24
//年份的日期
moment().format('DDD'); //84
//星期几
moment().format('dddd'); //Monday
//更具体的格式
moment().format('YYYY-MM-DD HH:mm:ss'); //2020-03-23 18:10:54
moment().format('YYYY[测]MM[试]DD HH[时]mm[间]ss'); //2020测03试23 18时25间42
moment().format('YYYY [test] YYYY'); //2020 test 2020
moment().format('YYYY [test] MM'); //2020 test 03
moment().format('YYYY [test] DD'); //2020 test 23

转换JS原声Date对象

moment().toDate()
new Date(moment())

设置时间

moment().year(2019)       //   设置年
moment().month(9)   //   设置月( 0~11, 0 =>1月, 11=>12月)
moment().date(2)     //  设置日期
moment().isoWeekday(1) // 设置日期为本周周一

moment().add(1, 'years')    //  设置下一年
moment().add(1, 'months')   // 设置下一月
moment().add(1, 'days')    //  设置下一天
moment().add(1, 'weeks')    //  设置下一周

moment().subtract(1, 'years')    //  设置上一年
moment().subtract(1, 'months')   // 设置上一月
moment().subtract(1, 'days')    //  设置上一天
moment().subtract(1, 'weeks')    //  设置上一周

比较时间

let startDate = moment().subtract(1, 'weeks')
let endDate = moment()
endDate.diff(startDate)     // 返回毫秒数
 
endDate.diff(startDate, 'months')     // 0
endDate.diff(startDate, 'weeks')      // 1
endDate.diff(startDate, 'days')       // 7
startDate.diff(endDate, 'days')      // -7



  //一个时间距离另一个时间差值换算
  let startTime = moment(createTime).format('YYYY-MM-DD HH:mm:ss')
  let endTime = moment().format('YYYY-MM-DD HH:mm:ss')
  
  let start_date = moment(startTime, "YYYY-MM-DD HH:mm:ss");
  let end_date = moment(endTime, "YYYY-MM-DD HH:mm:ss");
  //秒
  let seconds = end_date.diff(start_date, "seconds");
  //分钟
  let mintus = (seconds / 60);
  //小时
  let hours = (mintus / 60);
  //天
  let day = (hours/24)

时间戳字符串互相转换

moment(1259186487000).format('YYYY-MM-DD HH:mm:ss'); //2009-11-26 06:01:27
moment('2009-11-26 06:01:27').valueOf(); //1259186487000
moment('2009-11-26 06:01:27'); //1259186487000

相对时间

moment('20091126', 'YYYYMMDD').fromNow(); //10 years ago
moment('20091126', 'YYYYMMDD').fromNow(true); //10 years
moment([2009, 11, 26]).fromNow(); //10 years ago
moment().startOf('day').fromNow(); //15 hours ago
moment().endOf('hour').fromNow(); //in 24 minutes

时间查询

//查询当前年份是否为闰年
moment([2009]).isLeapYear(); //false
//检查一个时间是否在另一个时间之前(精确到秒比较)
moment('2009-11-26 06:01:27').isBefore('2009-11-26 06:01:28'); //true
//检查一个时间是否在另一个时间之前(精确到年比较)
moment('2009-11-26 06:01:27').isBefore('2009-11-26 06:01:28', 'year'); //false
//检查一个时间是否在另一个时间之后
moment('2009-11-26').isAfter('2020-11-26', 'year'); //false
//检查一个时间是否在其他两个时间之间
moment('2016-11-26').isBetween('2009-11-26', '2020-11-26'); //true
//获取当月的天数
moment('2009-11', 'YYYY-MM').daysInMonth(); //30
//获取当前 moment 年份的周数
moment().weeksInYear(); //52

时长创建

//要创建时长,调用 moment.duration(),默认以毫秒为单位。
//创建时长1500毫秒
moment.duration(1500);
//获取时长的毫秒数(返回 0 至 999 之间的数字)
moment.duration(1500).milliseconds(); //500
//获取时长的秒数(返回 0 至 59 之间的数字)
moment.duration(1500).seconds(); //1
//获取时长的长度(以秒为单位)
moment.duration(1500).asSeconds(); //1.5
//以秒为单位创建时长
moment.duration(2, 'seconds');
//以年为单位创建时长
moment.duration(2, 'years');

日历时间显示

//要创建时长,调用 moment.duration(),默认以毫秒为单位。
//创建时长1500毫秒
moment.duration(1500);
//获取时长的毫秒数(返回 0 至 999 之间的数字)
moment.duration(1500).milliseconds(); //500
//获取时长的秒数(返回 0 至 59 之间的数字)
moment.duration(1500).seconds(); //1
//获取时长的长度(以秒为单位)
moment.duration(1500).asSeconds(); //1.5
//以秒为单位创建时长
moment.duration(2, 'seconds');
//以年为单位创建时长
moment.duration(2, 'years');

切换中文

moment.defineLocale('zh-cn', {  
        months : '一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月'.split('_'),  
        monthsShort : '1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月'.split('_'),  
        weekdays : '星期日_星期一_星期二_星期三_星期四_星期五_星期六'.split('_'),  
        weekdaysShort : '周日_周一_周二_周三_周四_周五_周六'.split('_'),  
        weekdaysMin : '日_一_二_三_四_五_六'.split('_'),  
        longDateFormat : {  
            LT : 'Ah点mm分',  
            LTS : 'Ah点m分s秒',  
            L : 'YYYY-MM-DD',  
            LL : 'YYYY年MMMD日',  
            LLL : 'YYYY年MMMD日Ah点mm分',  
            LLLL : 'YYYY年MMMD日ddddAh点mm分',  
            l : 'YYYY-MM-DD',  
            ll : 'YYYY年MMMD日',  
            lll : 'YYYY年MMMD日Ah点mm分',  
            llll : 'YYYY年MMMD日ddddAh点mm分'  
        },  
        meridiemParse: /凌晨|早上|上午|中午|下午|晚上/,  
        meridiemHour: function (hour, meridiem) {  
            if (hour === 12) {  
                hour = 0;  
            }  
            if (meridiem === '凌晨' || meridiem === '早上' ||  
                    meridiem === '上午') {  
                return hour;  
            } else if (meridiem === '下午' || meridiem === '晚上') {  
                return hour + 12;  
            } else {  
                // '中午'  
                return hour >= 11 ? hour : hour + 12;  
            }  
        },  
        meridiem : function (hour, minute, isLower) {  
            var hm = hour * 100 + minute;  
            if (hm < 600) {  
                return '凌晨';  
            } else if (hm < 900) {  
                return '早上';  
            } else if (hm < 1130) {  
                return '上午';  
            } else if (hm < 1230) {  
                return '中午';  
            } else if (hm < 1800) {  
                return '下午';  
            } else {  
                return '晚上';  
            }  
        },  
        calendar : {  
            sameDay : function () {  
                return this.minutes() === 0 ? '[今天]Ah[点整]' : '[今天]LT';  
            },  
            nextDay : function () {  
                return this.minutes() === 0 ? '[明天]Ah[点整]' : '[明天]LT';  
            },  
            lastDay : function () {  
                return this.minutes() === 0 ? '[昨天]Ah[点整]' : '[昨天]LT';  
            },  
            nextWeek : function () {  
                var startOfWeek, prefix;  
                startOfWeek = moment().startOf('week');  
                prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';  
                return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';  
            },  
            lastWeek : function () {  
                var startOfWeek, prefix;  
                startOfWeek = moment().startOf('week');  
                prefix = this.unix() < startOfWeek.unix()  ? '[上]' : '[本]';  
                return this.minutes() === 0 ? prefix + 'dddAh点整' : prefix + 'dddAh点mm';  
            },  
            sameElse : 'LL'  
        },  
        ordinalParse: /\d{1,2}(日|月|周)/,  
        ordinal : function (number, period) {  
            switch (period) {  
            case 'd':  
            case 'D':  
            case 'DDD':  
                return number + '日';  
            case 'M':  
                return number + '月';  
            case 'w':  
            case 'W':  
                return number + '周';  
            default:  
                return number;  
            }  
        },  
        relativeTime : {  
            future : '%s内',  
            past : '%s前',  
            s : '几秒',  
            m : '1 分钟',  
            mm : '%d 分钟',  
            h : '1 小时',  
            hh : '%d 小时',  
            d : '1 天',  
            dd : '%d 天',  
            M : '1 个月',  
            MM : '%d 个月',  
            y : '1 年',  
            yy : '%d 年'  
        },  
        week : {  
            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效  
            dow : 1, // Monday is the first day of the week.  
            doy : 4  // The week that contains Jan 4th is the first week of the year.  
        }  
    });

秒换算日期

function formatSecToStr(seconds){
    let daySec = 24 *  60 * 60;
	let hourSec=  60 * 60;
	let minuteSec=60;
    let dd = Math.floor(seconds / daySec);
    let hh = Math.floor((seconds % daySec) / hourSec);
    let mm = Math.floor((seconds % hourSec) / minuteSec);
	let ss=seconds%minuteSec;
    if(dd > 0){
      return dd + "天" + hh + "小时" + mm + "分钟"+ss+"秒";
    }else if(hh > 0){
      return hh + "小时" + mm + "分钟"+ss+"秒";
    } else if (mm > 0){
      return mm + "分钟"+ss+"秒";
    }else{
      return ss+"秒";
    }
}