[moment 使用]-javascript使用

在JS项目中经常会对时间进行各种处理,转换。特别是数据库里的时间格式是非可读时,更需要转换来转换去的,我就经常用到,而moment.js 是个非常棒的库!
下面对moment.js的部分内容进行归纳总结。

格式化日期

当前时间:

moment().format('YYYY-MM-DD HH:mm:ss');     //'2017-03-09 20:06:05'

星期几计算

moment().format('d'); //4 

转换当前时间为unix时间戳(是秒,10位的数字)

moment().format('X') //和moment().unix()等价
> moment().unix()
1470365749

Note:而moment出来的是毫秒,13位的数字

> +moment()
1470365741564

unix时间戳转换为毫秒

moment.unix(secTimestamp) == moment(secTimestamp * 1000) //注意这里moment没有括号哦

将日期转换为毫秒/秒

+moment(‘2016/09/13’, ‘YYYY/MM/DD’)
1473696000000
+moment(‘2016/09/13’, ‘YYYY/MM/DD’).unix()
1473696000

相对时间
20131001相对当前日期是3年前

> moment("20131001", "YYYYMMDD").fromNow();
'3 years ago'

add(period, number)——这种方式已经弃用,改用新的方式add(number, period)

注意:Deprecation warning: moment().subtract(period, number) is deprecated. Please use moment().subtract(number, period)


> moment().add(7, 'year').format('YYYY-MM-DD')
'2024-03-14'
> moment().add(7,'month').format('YYYY-MM-DD')
'2017-10-14'
> moment().add(7,'week').format('YYYY-MM-DD')
'2017-05-02'
> moment().add(7,'day').format('YYYY-MM-DD')
'2017-03-21'
> moment().add(7,'hour').format('YYYY-MM-DD')
'2017-03-14'
> moment().add(7,'hour').format('YYYY-MM-DD HH:mm:ss')
'2017-03-14 23:52:12'

moment(milliSecond_timeStamp).subtract(1, 'day');

所有我们可以编写一个动态format的函数实现d.add(1, interval.replace(‘isoweek’, ‘week’))

function formatDate(milliSecTimestamp, interval) { //timestamp must be millisecond
    var formats = {day: 'YYYY-MM-DD', isoweek: 'YYYY[-]WW', month: 'YYYY[-]MM', year: 'YYYY', week: 'YYYY[-]ww'};
    return moment(milliSecTimestamp).format(formats[interval]);
};
function generateDateIntervalSeries(startTimeMilliSec, endTimeMilliSec, interval) {
    var series = [];
    for(var d = startTimeMilliSec.clone(); d.isBefore(endTimeMilliSec); d.add(1, interval.replace('isoweek', 'week'))) { //note no isoweek format of add
        series.push(formatDate(d, interval));
    }
    return series; //time pattern as interval
}

var openSeries = generateDateIntervalSeries(moment.unix(begin), moment.unix(end), interval, function(m) { //this anonymous function will no used here
     return +m.unix();
}); //openSeries will equals to series!

日常开发中最常用的是格式化时间,下面是格式制作成表格说明:
详细内容参考:https://momentjs.com/docs/#/parsing/ —搜索Display

格式代码说明返回值例子
M数字表示的月份,没有前导零1到12
MM数字表示的月份,有前导零01到12
MMM三个字母缩写表示的月份Jan到Dec
MMMM月份,完整的文本格式January到December
Q季度1到4
D月份中的第几天,没有前导零1到31
DD月份中的第几天,有前导零01到31
do星期中的第几天0th 1st … 5th 6th
d星期中的第几天,数字表示0到6,0表示周日,6表示周六
ddSu Mo … Fr Sa
ddd三个字母表示星期中的第几天Sun到Sat
dddd星期几,完整的星期文本从Sunday到Saturday
eDay of Week (Locale)0 1 … 5 6
EDay of Week (ISO)1 2 … 6 7
w年份中的第几周not iso1 2 … 52 53
WWeek of Year (ISO)1 2 … 52 53
YYYY四位数字完整表示的年份如:2014 或 2000
YY两位数字表示的年份如:14 或 98
A大写的AM PMAM PM
a小写的am pmam pm
HH小时,24小时制,有前导零00到23
H小时,24小时制,无前导零0到23
hh小时,12小时制,有前导零00到12
h小时,12小时制,无前导零0到12
m没有前导零的分钟数0到59
mm有前导零的分钟数00到59
s没有前导零的秒数1到59
ss有前导零的描述01到59
XUnix时间戳1411572969

而数据库里一般存的是秒级别的,所以需要如下使用

//format to year/month/day
var tmpDay = moment(buildend*1000).format('YYYY/MM/DD');//buildend time must be mil-second, so we need to multiplex 1000.
var mmdd = moment(buildend*1000).format('MM/DD');

//format to weekday(1,2,3,4,5,6(sat),7(sun))
var tmpWeekDay = moment(buildend*1000).format('E');

//format to weekday(1,2,3,4,5,6(sat),0(sun))
var tmpWeekDay =tmpDay.day()

JavaScript 中 moment实际使用
根据实际需要动态生成相应的时间格式

根据时间数字格式和interval=[day, isoweek, month, year, week] 来动态生成 想要的日期格式


/*
*根据时间数字格式和interval=[day, isoweek, month, year, week] 来动态生成 想要的日期格式
* eg: moment(millisecond_timestamp).format('YYYY-MM-DD')
*/
function formatDate(milliSecTimestamp, interval) { //timestamp must be millisecond
    var formats = {day: 'YYYY-MM-DD', isoweek: 'YYYY[-]WW', month: 'YYYY[-]MM', year: 'YYYY', week: 'YYYY[-]ww'};
    return moment(milliSecTimestamp).format(formats[interval]);
};

根据日期格式和interval=[day, isoweek, month, year, week] 来动态生成 时间数字

/*
*根据日期格式和interval=[day, isoweek, month, year, week] 来动态生成 时间数字
* eg: +moment('2016-03-02','YYYY-MM-DD').unix()
*/
function formateDateToUnixNum(data, interval) { 
    var formats = {day: 'YYYY-MM-DD', isoweek: 'YYYY[-]WW', month: 'YYYY[-]MM', year: 'YYYY', week: 'YYYY[-]ww'};
    return +moment(data, formats[interval]).unix();
}

根据interval=[day, isoweek, month, year, week] 来动态生成表头名字

function formatTitleDate(interval) { //根据interval=[day, isoweek, month, year, week] 来动态生成表头名字
    var formats = {day: 'Year-Month-Day', isoweek: 'Year-Week', month: 'Year-Month', year: 'Year', week: 'Year-Week(Non ISO)'};
    return formats[interval];
};

根据interval的格式和开始时间,结束时间,生成连续的时间序列:

function generateDateIntervalSeries(startTimeMilliSec, endTimeMilliSec, interval) {
    var series = [];
    for(var d = startTimeMilliSec.clone(); d.isBefore(endTimeMilliSec); d.add(1, interval.replace('isoweek', 'week'))) { //note no isoweek format of add
        series.push(formatDate(d, interval));
    }
    return series; //time pattern as interval
}

var openSeries = generateDateIntervalSeries(moment.unix(begin), moment.unix(end), interval, function(m) { //this anonymous function will no used here
     return +m.unix();
}); //openSeries will equals to series!
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木瓜~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值