在JavaScript内置对象中,有一个很Date对象,它专门用来获取设置日期。
当然自带的方法也很多,这里不一一讲解列举,想回顾的可以移步菜鸟教程:JavaScript Date 对象。
此处感兴趣的是几个实用的案例,比如网上盛行 转换指定日期格式、 获取当前日期的前几天/后几天,等等。欢迎补充。
1. 将 标准时间 转化为指定格式
获取当前日期时间,我们知道通过方法 new Date()
就可以得到,但是获取到是一个标准格式时间 Fri Jan 18 2019 13:56:47 GMT+0800 (中国标准时间)
。但通常我们更渴望得到 2019-01-18 13:56:47
或者 2019/01/18 13:56:47
这种格式。
下面直接给出方案,若想深入了解,可以移步将 Date对象 转化为指定格式详解 —— 关于Date对象那些事(番外)
通用函数式
直接封装一个函数,然后调用函数,带入想要的日期格式即可。
/**
* formatDate
* @param {string} a 指定格式的字符串,例如 "yyyy-M-d h:m:s"
* @return {string}
*/
function formatDate(a){
var d = new Date();
var o = {
"M+": d.getMonth() + 1,
"d+": d.getDate(),
"h+": d.getHours(),
"m+": d.getMinutes(),
"s+": d.getSeconds(),
"q+": Math.floor((d.getMonth() + 3) / 3),
"S": d.getMilliseconds()
};
if (/(y+)/.test(a)) a = a.replace(RegExp.$1, (d.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) {
if (new RegExp("(" + k + ")").test(a)) a = a.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
}
return a;
}
// 调用方式
formatDate("yyyy-M-d"); // 2019-1-18
追加成Date对象的方法式
这种方式更直接,可以用 new Date()
后得到的日期对象,直接调用该方法。
/**
* Format 对Date的扩展,将 Date 转化为指定格式的String
* @param {String} a 指定格式的字符串,例如 "yyyy-M-d h:m:s"
* @return {String} 匹配指定格式的日期时间字符串
*
* 说明:月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
* 例子:
* (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
* (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Date.prototype.Format = function(a) {
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(a)) a = a.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) {
if (new RegExp("(" + k + ")").test(a)) a = a.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)))
}
return a
};
// 调用方式
new Date().Format("yy-MM-dd hh:mm:ss"); //19-01-18 15:04:30
2. 获取当前日期的n天后
有时候,我们可能想要得到明天是几号?后天是几号?n天后就几号? 比如想要获取明天是日期:
粗略想法:我们可以通过getDate
获取当前日期,然后通过+1
操作。但遇到月末那一天,第二天就应该是1
号,这就需要通过月份分别取判断,也可以做,但有点繁琐,这里就不给出了。
故作聪明的想法:Date
对象本身就很强大啊,我们能不能以日期格式累加一天,容它自己判断计算,我们最后再去getDate
啊。当然可以,看下面代码:
var d1 = new Date();// 当前日期
var d2 = new Date(d1.setDate(d1.getDate()+1)).getDate(); // 第二天日期(几号)
注意:setDate()
的返回值是: 调整过的日期的毫秒表示。所以我们需要再一次new Date(),让它成为标准日期对象。
我们可以考虑把它封装成一个函数,带入参数n
,来得到任意指定天数的前/后日期:
/**
* 获取当前时间前/后的某一天日期
* @param {number} n n天前(负数)/后(正数)
* @return {number} n天前/后的日期
*/
function getSomeoneDate(n) {
var d1 = new Date();// 当前日期
var d2 = new Date(d1.setDate(d1.getDate()+n)).getDate(); // n天前/后
return d2;
}
console.log(getSomeoneDate(-2));
console.log(getSomeoneDate(-1));
console.log(getSomeoneDate(0));
console.log(getSomeoneDate(1));
console.log(getSomeoneDate(2));
3. 设置日期为上个月15号
如果是想设置当前月的日期,比较简单,直接调用setDate()
方法,参数写入要设置的日期就可以了。但若是想设置上个月的指定日期,我们就需要先让Date
对象月份变成上个月。
此处可以用一个讨巧的方法:
- 先用
setDate(0)
- 设置上个月最后一天,让月份变成上个月。 - 紧接着再
setDate(15)
- 设置15号。
var d = new Date();// 1. 当前日期
console.log(d); // Fri Jan 18 2019 15:30:34 GMT+0800 (中国标准时间)
console.log(d.getDate()); // 18
d.setDate(15);// 2. 设置当前月份的15号
console.log(d); // Tue Jan 15 2019 15:27:54 GMT+0800 (中国标准时间)
d.setDate(0);// 3. 设置上个月最后一天
console.log(d); // Mon Dec 31 2018 15:30:58 GMT+0800 (中国标准时间)
d.setDate(15);// 4. 设置上个月15号。
// 注意,此处是因为在第3步骤中,变量d的月份已经变成了上个月,所以此处再设置15号,就变成了上个月15号
console.log(d); // Sat Dec 15 2018 15:38:31 GMT+0800 (中国标准时间)
注意:在setDate()
方法中,写入参数大于月份最大天数,会自动顺移到下个月的日期。比如当前月份是1月,调用setDate(33)
,就会得到 2月2号 。
上面的方法我们同样也可以封装如下:
/**
* 设置上个月的日期
* @param {number} n 日期号
* (n 的范围最好在所属月份的最大天数内,范围外不报错,会根据月份顺移日期)
*/
function setLastMonthDate(n){
var d = new Date();
d.setDate(0);
d.setDate(n);
}
console.log(setLastMonthDate(11)); // Tue Dec 11 2018 14:54:14 GMT+0800 (中国标准时间)