时间日期日常操作

不同应用场景不同计算方式,这里只放些简单日常所需;
时间类的操作水太深(比如chrome和safari的时间格式不一样),复杂的操作可用插件来操作,插件已做了兼容性处理(各位亦可根据实际情况自己写写):


Moment.js 目前版本:2.24.0 官网 github
JavaScript 日期处理类库,在javascript中解析,验证,操作和显示日期


Day.js github
Moment.js 的 2kB 轻量化方案,拥有同样强大的 API


Date的详细介绍

获取当前时间、日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Date.prototype.format = function(fmt) { 
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt)) {
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
for(var k in o) {
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}
new Date().format("yyyy-MM-dd hh:mm:ss")
// 2019-07-08 12:26:26

new Date().format("yyyy-MM-dd")
// 2019-07-08

new Date().format("yyyy/MM/dd")
// 2019/07/08

new Date().format("yyyy年MM月dd日")
// 2019年07月08日

距离现在时间差

日常用到的场景很多,比如:

  • 文章新闻类的发布后面经常带着日期显示,如:刚刚、10分钟、一小时内、昨天、一周前、一个月前、一年前,或者抢购一周前提示,出发头一天提醒
  • 到期类: 会员到期时间,比如2月28买的一个月会员,3月27到期,1月31买的一个月会员,2月28就到期了。 发布会倒计时,还有多少天,多少小时,多少秒
  • 聊天对话框中:晚上6:20、周一 20:00、1月3日 中午12:31、2018年1月1日 晚上08:00

下面的逻辑就是用时间戳来算,要是用插件来的话就简单了,有现成的方法fromNow()或者from():moment(v).from( moment(now) )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
var now = new Date('2019-01-01 07:40:31'),
listDate = [
'2019-01-01 07:39:50',
'2019-01-01 07:30:01',
'2019-01-01 07:21:56',
'2018-12-31 08:21:56',
'2018-11-03 08:21:56',
'2018-02-16 08:41:59',
'2018-02-27 08:21:56',
'2016-01-07 08:21:56'
],
getshowTime = (v) => {
let miao = Number(now) - Number(new Date(v) ),
txt = "";

if(miao<= 45000){ //45秒内
txt = "刚刚"
}else if( miao > 45000 && miao< 3600000 ){ //45秒到1小时之间
txt = Math.floor( miao / 60000 ) + "分钟前";
}else if ( miao >= 3600000 && miao< 86400000 ){ //24小时以内
txt = Math.floor( miao / 3600000 ) + "小时前"
}else if ( miao >= 86400 && miao< 604800000 ){ //24小时-7天内
txt = Math.floor( miao / 86400000 ) + "天前"
} else if ( miao >= 604800000 && miao< 2419200000 ){ //7天内-28天 按周算
txt = Math.floor( miao / 604800000 ) + "周前"
} else if ( miao >= 2419200000 && miao< 31536000000 ){ //28天-365天内按月算
txt = Math.floor( miao / 2419200000 ) + "个月前"
} else if ( miao >= 31536000000 ){ //365天以上按年算
txt = Math.floor( miao / 31536000000 ) + "年前"
}
return txt
};
listDate.forEach(function (v, i, arr) {
console.log( getshowTime(v) );
})
//刚刚
//10分钟前
//18分钟前
//23小时前
//2个月前
//11个月前
//10个月前
//2年前

时间格式转换

转时间戳

1
2
3
4
console.log( new Date().valueOf() )
console.log( new Date().getTime() )
console.log( Number(new Date()) )
//都是一个结果,如:1562578637502

时间戳转日期

直接用 new Date(时间戳) 格式转化获得时间日期,每个浏览器的结果会有所不同,得再格式化一下

1
2
new Date(1562577998147);
//Mon Jul 08 2019 17:26:38 GMT+0800 (中国标准时间)

日期的属性和方法

Date.prototype 方法

方法 描述
getDate() 根据本地时间返回指定日期对象的月份中的第几天(1-31)
getDay() 根据本地时间返回指定日期对象的星期中的第几天(0-6)
getFullYear() 根据本地时间返回指定日期对象的年份(四位数年份时返回四位数字)
getHours() 根据本地时间返回指定日期对象的小时(0-23)
getMilliseconds() 根据本地时间返回指定日期对象的毫秒(0-999)
getMinutes() 根据本地时间返回指定日期对象的分钟(0-59)
getMonth() 根据本地时间返回指定日期对象的月份(0-11)
getSeconds() 根据本地时间返回指定日期对象的秒数(0-59)
getTime() 返回从1970-1-1 00:00:00 UTC(协调世界时)到该日期经过的毫秒数,对于1970-1-1 00:00:00 UTC之前的时间返回负值。
getTimezoneOffset() 返回当前时区的时区偏移
getUTCDate() 根据世界时返回特定日期对象一个月的第几天(1-31)
getUTCDay() 根据世界时返回特定日期对象一个星期的第几天(0-6)
getUTCFullYear() 根据世界时返回特定日期对象所在的年份(4位数)
getUTCHours() 根据世界时返回特定日期对象当前的小时(0-23)
getUTCMilliseconds() 根据世界时返回特定日期对象的毫秒数(0-999)
getUTCMinutes() 根据世界时返回特定日期对象的分钟数(0-59)
getUTCMonth() 根据世界时返回特定日期对象的月份(0-11)
getUTCSeconds() 根据世界时返回特定日期对象的秒数(0-59)
getYear() 根据特定日期返回年份 (通常 2-3 位数). 使用 getFullYear()
setDate() 根据本地时间为指定的日期对象设置月份中的第几天
setFullYear() 根据本地时间为指定日期对象设置完整年份(四位数年份是四个数字)
setHours() 根据本地时间为指定日期对象设置小时数
setMilliseconds() 根据本地时间为指定日期对象设置毫秒数
setMinutes() 根据本地时间为指定日期对象设置分钟数
setMonth() 根据本地时间为指定日期对象设置月份
setSeconds() 根据本地时间为指定日期对象设置秒数
setTime() 通过指定从 1970-1-1 00:00:00 UTC 开始经过的毫秒数来设置日期对象的时间,对于早于 1970-1-1 00:00:00 UTC的时间可使用负值
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)
setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)
setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)
setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)
setUTCSeconds() 根据世界时设置 Date 对象中的秒钟 (0 ~ 59)
setYear() setYear() 方法用于设置年份。请使用 setFullYear() 方法代替
toDateString() 以人类易读(human-readable)的形式返回该日期对象日期部分的字符串
toISOString() 把一个日期转换为符合 ISO 8601 扩展格式的字符串
toJSON() 使用 toISOString() 返回一个表示该日期的字符串。为了在 JSON.stringify() 方法中使用
toGMTString() 返回一个基于 GMT (UT) 时区的字符串来表示该日期。请使用 toUTCString() 方法代替
toLocaleDateString() 返回一个表示该日期对象日期部分的字符串,该字符串格式与系统设置的地区关联(locality sensitive)
toLocaleFormat() 使用格式字符串将日期转换为字符串
toLocaleString() 返回一个表示该日期对象的字符串,该字符串与系统设置的地区关联(locality sensitive)。覆盖了 Object.prototype.toLocaleString() 方法
toLocaleTimeString() 返回一个表示该日期对象时间部分的字符串,该字符串格式与系统设置的地区关联(locality sensitive)
toSource() 返回一个与Date等价的原始字符串对象,你可以使用这个值去生成一个新的对象。重写了 Object.prototype.toSource() 这个方法
toString() 返回一个表示该日期对象的字符串。覆盖了Object.prototype.toString() 方法
toTimeString() 以人类易读格式返回日期对象时间部分的字符串
toUTCString() 把一个日期对象转换为一个以UTC时区计时的字符串
valueOf() 返回一个日期对象的原始值。覆盖了 Object.prototype.valueOf() 方法