有时候项目中会遇到这些问题,比如:我想获取当前时间中的时分秒,又或者说是想单独获取年份,月份,日等。这就需要对Date类型的方法做点了解了。
还有一种场景是我想将当前时间转换成“yyyy-mm-dd HH:mm:ss”等固定格式的,今天我们就来探讨一下。
Date对象中的具体方法主要可以分为两大类:
方法 |
作用 |
getFullYear() |
通过Date对象获取四位数字表示的年份 |
getMonth() |
通过Date对象获取一年中第几个月份,取值是0-11 |
getDate() |
通过Date对象获取一个月中的某一天,取值是1-31 |
getDay() |
通过初始化的Date对象获取一周中的第几天,取值是0(周日)- 6(周六) |
getHours() |
通过初始化的Date对象获取小时数,取值是0-23 |
getMinutes() |
通过初始化的Date对象获取分钟数,取值是0-59 |
getSeconds() |
通过初始化的Date对象获取秒数,取值是0-59 |
getMilliseconds() |
通过初始化的Date对象获取毫秒数,取值是0-999 |
getTime() |
获取从1970年1月1日到通过初始化Date对象的毫秒数 |
方法 |
作用 |
setFullYear(yyyy) |
通过Date对象设置四位数字表示的年份yyyy |
setMonth(mm) |
通过Date对象设置一年中第几个月份mm |
setDate(dd) |
通过Date对象设置一个月中的某一天dd |
setHours(hh) |
通过初始化的Date对象设置小时数hh |
setMinutes(mm) |
通过初始化的Date对象设置分钟数mm |
setSeconds(ss) |
通过初始化的Date对象设置秒数ss |
setMilliseconds(ms) |
通过初始化的Date对象设置毫秒数ms |
setTime(ms) |
设置从1970年1月1日到通过初始化Date对象的毫秒数ms |
set时间的方法中的参数类型是整数类型。其中的参数没有大小的限制。比如:setMonth(mm)方法,可能你认为mm的大小会限制在0-11之间,其实不然,据验证,当其参数超过了11时,比如D.setMonth(12),该方法就会将D时间对象存储的年份进位1个单位,这有些像二进制、八进制、十进制中的逢二进一、逢八进一、逢十进一一样的道理。
1.将当前时间按”yyyy/mm/dd hh:min:ss”的形式
var D = new Date(); //获取当前时间的时间对象
var yyyy = D.getFullYear(); //获取四位数字表示的年份
/*获取月份,
+1是因为getMonth方法返回的0(一月份)-11(十二月份)*/
var mm = D.getMonth()+1;
var dd = D.getDate(); //获取日期
var hh = D.getHours(); //获取小时数
var min = D.getMinutes(); //获取分钟数
var ss = D.getSeconds(); //获取秒
//分隔符
var sep1 = "/";
var sep2 = ":";
//用"0"补位不足两位数的时间
mm = (mm<10)?("0"+mm):mm;
dd = (dd<10)?("0"+dd):dd;
hh = (hh<10)?("0"+hh):hh;
min = (min<10)?("0"+min):min;
ss = (ss<10)?("0"+ss):ss;
var format = yyyy+sep1+mm+sep1+dd+" "+hh+sep2+min+sep2+ss;
//就在我这里此时的时间是:2017/06/03 11:37:01
2.45天之后的日期是多少
var D = new Date(); //获取今天的时间对象
var dd = D.getDate(); //获取今天是几号
var d45 = dd+45; //加45天
D.setDate(d45); //此时D对象已经被设置成了45天之后的时间对象
/**
此处再写上上例中获取时间的方法
即可得到相应格式的日期字符串
**/
注意:js中的new Date() 获取到的是本地时间,如果想获取服务器时间,两种方式:
Date d = new Date($.ajax({async:true}).getResponseHeader("Date"));
注意:方法二不建议使用,他会不定期的报bug(根据电脑配置以及不同浏览器之间),最后结果就会导致时间获取不到前端报错,从而使时间默认成1970-01,即计算机默认时间! 具体解决办法请看这篇文章——>
解决IE浏览器显示1970问题
在网上可以搜到的方法很多,在这里,我举一个自己认为最简洁的,也最通俗易懂的方法,适合匹配所有; -->正则表达式写法
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;
};
var time=new Date().Format("yyyy-MM-dd");
var time=new Date().Format("yyyy-MM-dd HH:mm:ss");
当然,这个方法也行,只不过觉得emmm.....脑补~~
var d = new Date('Thu May 12 2016 08:00:00 GMT+0800 (中国标准时间)');
var datetime=d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate() + ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
看个人选择吧~~~~~~
另外在此之前,自己使用的也不是这个方法,是自己认为简单的,结果没想到是有bug的 -.-,在这里列出来也给广大同胞们提个醒。
我这里给出的需求是这样的,因为我这里只需要获取“yyyy-mm”,如下
话不多说,上代码:
var yearmonth = new Date();
//此方法的作用是将时间格式转换为“yyyy-mm”,比如“2019-04”,其中toLocaleDateString
//的作用是将date转换为“yyyy/mm”的字符串,join方法是将其转换为“yyyy-mm”
yearmonth = yearmonth.toLocaleDateString().split('/').join('-');
if(yearmonth.length == 10){
yearmonth = yearmonth.substr(0,7);
}else{
yearmonth = yearmonth.substr(0,4) + "-0" + yearmonth.substr(5,1);
}
接下来,我要说一下这样写存在的坑在哪:
其实主要原因是在于toLocaleDateString()这个方法,他在不同浏览器中得到的结果不太一样,例如
# firefox
> new Date().toLocaleDateString()
> output: "2019/04/30"
#IE11
> new Date().toLocaleDateString()
> output: "2019-4-30"
#Chrome < 58
> new Date().toLocaleDateString()
> output: "2019/4/30"
#Chrome >= 58
> new Date().toLocaleDateString()
> output: "2019-4-30"
在不同浏览器之间,他可能会抛出uncaught TypeError: cannot read property 'length' of undefined。空指针异常
所以尽可能的不要用toLocaleDateString()这个方法
//其中Format是使用上面格式化的函数的
var firstDayOfMonth= new Date(new Date().getFullYear(), new Date().getMonth()-1, 1).Format("yyyy-MM-dd HH:mm:ss");
//其中Format函数是采用上面格式化函数
var lastDayOfMonth= new Date(new Date().getFullYear(), new Date().getMonth(), 0).Format("yyyy-MM-dd HH:mm:ss");
https://blog.csdn.net/xiyan_yuan/article/details/77879892
https://segmentfault.com/a/1190000009391790
https://blog.csdn.net/weixin_39256994/article/details/81611791