let d = new Date() 时间对象实例

1、d.getDate( ) 返回一个月中的某一天

2、d.getDay( ) 返回一周中的某一天( 0 ~ 6 ) 需要加1

3、d.getMonth( ) 返回月份 ( 0 ~ 11 ) 需要加1

4、d.getFullYear( ) 返回4位数的年份

5、d.getHours( ) 返回小时 ( 0 ~ 23 )

6、d.getMinutes( ) 返回分钟( 0 ~ 59 )

7、d.getSeconds( ) 返回秒数 ( 0 ~ 59 )

8、d.getMiliseconds( ) 返回毫秒数 ( 0 ~ 999)

9、d.getTime( ) 返回自1970年1月1日 到当前时间的毫秒数

解释:1970年1月1日是计算机的纪元年

// 测试1亿次循环,执行时间
let first = new Date().getTime()
for( let i = 0; i < 100000000; i ++ ) {}
let time = new Date().getTime() - first
console.log(time) // 67

 

tips

1、定义new Date( ) 时,如果只初始化了一次,那么它只会记录那一时刻的年月日时分秒,并不会变化,除非再次初始化!

 

封装 - 获取当前时间 或 根据时间戳来获取时间

支持:时间戳、多个时间戳(数组格式)返回时间。。。

如: 

getTime( 'yyyy-MM-dd hh:mm:ss',  [1590238800000,  1590240600000] ) 返回:

js date 时间_正则表达式

getTime( 'yyyy/MM/dd hh:mm:ss',  1590238800000 )  返回:

js date 时间_构造函数_02

// 注意yyyy-MM-dd 大小写的格式 !!!!!!!!!!!!
function getTime(fmt = 'yyyy-MM-dd', tiemStamp=null) {
let time
if (tiemStamp) {
time = Array.isArray(tiemStamp) ? tiemStamp.map(i => {
return returnTime(fmt, i)
}) : returnTime(fmt, tiemStamp)
} else {
time = returnTime(fmt, new Date().getTime()) // 或 Date.now()
}
return time
}
function returnTime(fmt, tiemStamp) {
const date = new Date(tiemStamp)
// console.log(date)
var o = {
"y+" : date.getFullYear(),
"M+" : date.getMonth()+1, //月份
"d+" : date.getDate(), //日
"h+" : date.getHours(), //小时
"m+" : date.getMinutes(), //分
"s+" : date.getSeconds(), //秒
"S" : date.getMilliseconds() //毫秒
}
// RegExp.$1 正则第一个分组匹配的结果
for(var k in o) {
if (new RegExp("(" + k + ")").test(fmt)) {
fmt = fmt.replace(RegExp.$1, o[k].toString().length === 1 ? '0' + o[k] : o[k] )
}
}
return fmt
}

**补充**:

(1)以上写法:

new RegExp("(" + k + ")")  相当于 new RegExp("(y+)")  new RegExp("(M+)") ··· ···

tips:

这种构造函数创建的正则 参数必须为字符串,且支持动态匹配,而对象字面量创建的正则不支持动态匹配。

MDN:

在脚本运行过程中,用构造函数创建的正则表达式会被编译。如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生,就需要使用构造函数来创建正则表达式。

RegExp.$1 匹配子串,相当于复制了一份匹配的子串。

MDN: 括号 - 在正则表达式中常用作记忆设备。即这部分所匹配的字符将会被记住以备后续使用

(2)我们还会经常看到这种写法:

let cls = 'test'
let reg = new RegExp(cls+ '(\\s)','g')

后边'(\\s)' 的写法表示匹配空白字符,\ 斜线需要转义,所以加了2个斜线!

 

返会当前时间和之前时间的时间间隔

如:20分钟之前 、1小时之前、10小时之前、1天之前 ··· ···

function pluralize(time, param) {
if (time === 1) {
return time + param
} else {
return time + param + 's'
}
}
/**
* time 毫秒事件戳 或 时间 '2020-05-23 21:23' /
* ~ 按位取反运算符 ~~ 按位取反2次 结果都会变为整数
* 与Math.floor()不同的是,它只是单纯的去掉小数部分,不论正负都不会改
* 变整数部分
*
* */
function timeAgo(time) {
time = typeof time === 'string' ? new Date(time).getTime() / 1000 : time
let t = Date.now() / 1000 - time
if (t < 3600) { // 分钟
return pluralize(~~(t / 60), 'minute')
} else if (t < 86400) { // 小时
return pluralize(~~(t / 3600), 'hour')
} else { // 天
return pluralize(~~(t / 86400), 'day')
}
}