跳到主要内容

Date

几种获取数字时间戳的方式

+new Date();    // +A 运算会尝试把 A 转成数字类型
Date.now(); // 获取当前时间的毫秒戳
new Date().getTime();
new Date().valueOf(); // 与 getTime 方法一样
Date.parse('2019-10-11'); // 解析一个日期字符串,返回时间戳

计算两个日期相隔天数

代码如下:

function dateInterval(start, end){
var diff = Math.abs(start - end); // 取绝对值
return Math.ceil(diff / 1000 / 60 / 60 / 24); // 向上取整
}

startend 都是日期对象,两者相减会得到数字类型的毫秒戳。

判断某一年是不是闰年

闰年的 2 月是 29 天。代码如下:

function isLoopYear(year){
let date = new Date(year, 2, 0);
return date.getDate() === 29;
}

Date 的第一个参数是年份,第二个参数是月份,月份从 0 开始,2 表示三月,第三个参数是这个月的第几天,0 表示上个月的最后一天。

判断输入的日期是不是今天

输入一个形如 “2019/10/9” 或者 “2019-10-9” 的日期格式,判断输入的日期是不是今天。这个函数不止一种实现方式。利用 Date.toLocaleDateString() 方法实现就是其中一种。

function isToday(str){
var s = str.replace(/\-/g,"/"),
// 考虑到 IE 兼容性
// 在 IE 中,toLocaleString() 的日期格式是这样的:"xxxx年xx月xx日"
nowDate = (new Date()).toLocaleString().replace(/||/g,"/");
if(s === nowDate){
return true;
}
return false;
}

在 IE 浏览器中,toLocaleDateString() 方法返回的日期格式为 “xxxx年xx月xx日”(当然,只能在中文页面适用),因此需要将“年”、“月”、“日”替换成“/”。为了兼容,输入 “xxxx-xx-xx” 的日期格式时,应把这种格式转成“xxxx/xx/xx” 的格式。因为除了 IE 之外,其它浏览器的 toLocaleDateString() 的方法默认返回的都是 “xxxx/xx/xx” 格式的日期。

还有一个方法,将输入的字符串的年月日拆解出来,比较年月日的大小是否相同来实现。

function isToday(str){
str = str.replace(/\-/g,'/');
var s = str.split("/");
var now = new Date();
return (
Number(s[0]) === now.getFullYear() &&
Number(s[1]) === now.getMonth() + 1 &&
Number(s[2]) === now.getDate()
);
}

为了让如输入的日期格式正确,可以使用正则表达式做判断:

const reg = /^\d{4}(-|\/)(1[0-2]|(0?[1-9]))\1([0-2][1-9]|[1-9]|30|31)/;
if(!reg.test(str)){
throw Error("The arguments' format must be like 'xxxx-xx-xx' or 'xxxx/xx/xx'");
}