ECMAScriptJS基础篇–日期Date详解与实例扩充

一:Date类型介绍

要创造一个日子对象,使用new操作符和Date构造函数即可:

var now = new Date();

Date.parse()方法

其中Date.parse()主意接收一个意味日期的字符串参数,然后尝试依照这一个字符串再次来到相应日期的阿秒数。ECMA-262不曾概念Date.parse()应当协理哪一类日期格式,因而这几个格局的表现因落成而异,而且寻常是因地区而异。将地点安装为美国的浏览器普通都接受下罗萨里奥期格式:

  • “月/日/年”,如6/13/2004;

  • “英文月名 日,年”,如May 12,2004;

  • “英文星期几 英文月名 日 年 时:分:秒 时区”,如Tue May 25 2004
    00:00:00 GMT+0800。

  • ISO 8601扩大格式YYYY-MM-DDTHH:mm:ss:sssZ(例如
    2004-05-25T00::00:00)。唯有包容ECMAScript5的落到实处支持这种格式。

诸如,要为二〇〇四年6月25日制造一个日期对象,可以选择下边的代码:

//Tue May 25 2004 00:00:00 GMT+0800 (中国标准时间)
var someDate = new Date(Date.parse('May 25,2004'));

要是传入Data.parse()的点子的字符串不可以代表日期格式,会回到NAN。实际上,若是直白将代表日期的字符串传递给Date构造函数,也会在后台调用Date.parse()艺术,例如上边的代码跟前面的是等价的。

//Tue May 25 2004 00:00:00 GMT+0800 (中国标准时间)
var someDate = new Date('May 25,2004'); 

那行代码将会拿到与前方一行相同的日子对象。

Date.UTC()方法
Date.UTC()一致重临日期的飞秒数。但它与Date.parse()在创设值时利用的是不同的信息Date.UTC()的参数分别代表年份、基于0的月数(7月是0,七月是1,依次类推)、月尾的曾几何时(1到31)、小时数(0到23)、分钟、秒、飞秒数。在那么些参数中只有前两个参数是必须的(年和月)。即使没有提供月初的天数,则只要天数为1;假若省略其余参数,则统统要是为0,如下例子:

//GMT时间2000年1月1日午夜零时
var y2k = new Date(Date.UTC(2000,0));
console.log(y2k); //Sat Jan 01 2000 08:00:00 GMT+0800 (中国标准时间)

//GMT时间2005年5月5日下午5:55:55
var allFives = new Date(Date.UTC(2005,4,5,17,55,55));
console.log(allFives);//Fri May 06 2005 01:55:55 GMT+0800 (中国标准时间)

注脚下:格林wich Mean 提姆e
(GMT)格林尼治标准时间英帝国、爱尔兰、冰岛和葡萄牙共和国属于该时区。那个时区与中国日本东京时间的时差是8个小时,也就是说比上海时间晚8个钟头。

Date构造函数
Date构造函数会模仿Date.UTC(),但有一点不等的是,日期和岁月都是依据本地时区而非GMT来创立。然而他俩的参数跟Date.UTC()的参数一样。

例如:

//本地时间2000年1月1日午夜零时
var y2k = new Date(2000,0);
console.log(y2k); //Sat Jan 01 2000 00:00:00 GMT+0800 (中国标准时间)

//本地时间2005年5月5日下午5:55:55
var allFives = new Date(2005,4,5,17,55,55);
console.log(allFives);//Thu May 05 2005 17:55:55 GMT+0800 (中国标准时间)

给Date构造函数传递参数常选拔如下三种办法:(注:参数可以为整数;
也可以为字符串; 但格式必须正确)

  • new Date(2009,1,1); //正确

  • new Date(“2009/1/1”); //正确

  • new Date(“2009-1-1”);
    //不包容,在谷歌(Google)下能分析,在IE浏览器9及以上结果为[date] Invalid
    Date,IE8及以下结果为NAN。

评释:日期对象new Date()的参数方式如下:

1)new Date(“month dd,yyyy hh:mm:ss”);
2)new Date(“month dd,yyyy”);
3)new Date(yyyy,mth,dd,hh,mm,ss);
4)new Date(yyyy,mth,dd);
5)new Date(ms);

急需注意最后一种方式,参数表示的是内需创立的时刻和
GMT时间1970年十一月1日中间相差的飞秒数。各个函数的意思如下:

month:用英文 表示月份名称,从January到December
mth:用整数表示月份,从0(1月)到11(12月)
dd:表示一个 月首的第几天,从1到31
yyyy:四位数表示的年度
hh:小时数,从0(午夜)到23(晚11点)
mm: 分钟数,从0到59的整数
ss:秒数,从0到59的整数
ms:阿秒数,为当先等于0的整数

例如:

new Date("January 12,2006 22:19:35"); 
new Date("January 12,2006"); 
new Date(2006,0,12,22,19,35); 
new Date(2006,0,12); 
new Date(1137075575000); 

地点的各个创立格局都代表二〇〇六年一月12日这一天。

Date.now()方法
ES5添加了Date.now()方法,重临表示那个格局时的日子和岁月的阿秒数。那一个方法简化了采纳Date对象分析代码的办事,例如:

//取得开始时间
var start = Date.now();

//调用函数
dosomething();

//取得结束时间
var stop = Date.now(),
    result = stop - start;
console.log(start,stop,result); //1494292306763 1494292306768 5

function dosomething(){
    console.log('打印结果');
}

支持Date.now()方法的浏览器包蕴IE9+,FireFox3+,Safari3+,Opera10.5+和Chrome。在不协理的其他浏览器,使用+操作符把Date对象转成字符串,也可以达标同等的目标。

//取得开始时间
var start = +new Date();

//调用函数
dosomething();

//取得结束时间
var stop = +new Date(),
    result = stop - start;
console.log(start,stop,result); //1494292306763 1494292306768 5

function dosomething(){
    console.log('打印结果');
}

那就是说就出去这么一个例子,JavaScript 获取当前飞秒时间戳有以下三种办法:

console.log(Date.parse(new Date()));    //结果:1494301186000//不推荐; 毫秒改成了000显示
console.log((new Date()).valueOf());    //结果:1494301186175       
console.log(new Date().getTime());      //结果:1494301186175    
console.log(Date.now());                //结果:1494301186175
console.log(+new Date());               //结果:1494301186175

后续的艺术

与别的引用类型一样,Date类型也重写了toLocaleString()toString()valueOf()方法。

其中toLocaleString()toString()在突显日期和岁月尚未怎么价值;而valueOf()方法不是回去的字符串,而是回到日期的微秒表示。由此得以方便使用相比操作符(大于或低于)来相比较日期值。如下边的事例:

var date1 = new Date(2007,0,1);
var date2 = new Date(2007,1,1);
console.log(date1 < date2); //true
console.log(date1 > date2); //false

日子格式化方法

Date类型还有一些专程用来将日期格式化为字符串的办法,如下:

toDateString()——以一定于贯彻的格式呈现星期几、月、日和年;

to提姆eString()——以特定于贯彻的格式突显时、分、秒和时区;

toLocaleDateString()——以特定与地方的格式突显星期几、月、日和年;

toLocale提姆eString()——以特定于已毕的格式展现时、分、秒;

toUTCString()——以一定于贯彻的格式完整的UTC日期。

与toLocaleString()和toString()方法一致,以上这么些字符串格式的办法输出也是因浏览器而异的。由此未曾哪一个主意可以用来在用户界面上出示同一的日子音讯。

日子/时间组件方法

以下青色标志为常用:

Date() 返回当日的日期和时间。
getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getFullYear() 从 Date 对象以四位数字返回年份。
getYear() 请使用 getFullYear() 方法代替。
getHours() 返回 Date 对象的小时 (0 ~ 23)。
getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
getTime() 返回 1970 年 1 月 1 日至今的毫秒数。
get提姆ezoneOffset() 重临本地时间与格林威治标准时间 (GMT) 的秒钟差。
getUTCDate() 依据世界时从 Date 对象再次来到月初的一天 (1 ~ 31)。
getUTCDay() 依据世界时从 Date 对象回到周中的一天 (0 ~ 6)。
getUTCMonth() 按照世界时从 Date 对象回到月份 (0 ~ 11)。
getUTCFullYear() 依据世界时从 Date 对象回来四位数的年份。
getUTCHours() 依据世界时重回 Date 对象的钟点 (0 ~ 23)。
getUTCMinutes() 依据世界时再次来到 Date 对象的秒钟 (0 ~ 59)。
getUTCSeconds() 按照世界时重返 Date 对象的秒钟 (0 ~ 59)。
getUTCMilliseconds() 依据世界时再次来到 Date 对象的毫秒(0 ~ 999)。
setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setFullYear() 设置 Date 对象中的年份(四位数字)。
setYear() 请使用 setFullYear() 方法代替。
setHours() 设置 Date 对象中的小时 (0 ~ 23)。
setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。
setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。
setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。
setTime() 以毫秒设置 Date 对象。
setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。
setUTCFullYear() 按照世界时设置 Date 对象中的年份(四位数字)。
setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。
setUTCMinutes() 按照世界时设置 Date 对象中的分钟 (0 ~ 59)。
setUTCSeconds() 按照世界时设置 Date 对象中的分钟 (0 ~ 59)。
setUTC米尔iseconds() 根据世界时设置 Date 对象中的阿秒 (0 ~ 999)。

调用方式:

var myDate = new Date();
myDate.getYear(); //获取当前年份(2位)
myDate.getFullYear(); //获取完整的年份(4位,1970-????)
myDate.getMonth(); //获取当前月份(0-11,0代表1月)         // 所以获取当前月份是myDate.getMonth()+1; 
myDate.getDate(); //获取当前日(1-31)
myDate.getDay(); //获取当前星期X(0-6,0代表星期天)
myDate.getTime(); //获取当前时间(从1970.1.1开始的毫秒数)
myDate.getHours(); //获取当前小时数(0-23)
myDate.getMinutes(); //获取当前分钟数(0-59)
myDate.getSeconds(); //获取当前秒数(0-59)
myDate.getMilliseconds(); //获取当前毫秒数(0-999)

简言之常用示例

1.得到当前光阴

function getNowTime() {
    return new Date();
}

2.小时与运气相加

function getTimeAddDays(time, days) {
    return new Date(time.getTime() + days * 24 * 60 * 60 * 1000);
}

3.获取并格式化日期:年-月-日

function getFormatDate(time) {
   return time.getFullYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate();
}

4.字符串转换为日期,字符串格式:2011-11-20

function convertToDate(strings) {
    return new Date(Date.parse(strings.replace(/-/g, "/")));
}

或者

function convertToDate(strings) {
    return new Date(strings.replace(/-/g, "/"));
}

5.得到并格式化星期

// 计算系统当前是星期几
var str = "今天是星期" + "日一二三四五六".charat(new Date().getDay());

可查看JS基础篇–JS总结系列当下日子是星期几的三种方法

6.时间比较

function compareTime(time1, time2) {
    return time1.getTime() - time2.getTime();
}

7.统计七个日子之间相隔的运气

function getDays(time1, tiem2){
    var day = 24*60*60*1000;
    return (time1.getTime() - time2.getTime())/day;
}

增加示例

1.JS论断某年某月有多少天

JavaScript里面的new Date("xxxx/xx/xx")以此日期的构造方法有一个妙处,当您传入的是”xxxx/xx/0″(0号)的话,得到的日期是”xx”月的前一个月的尾声一天(”xx”月的最大取值是69,题外话),假设传入"1999/13/0",会得到"1998/12/31"。而且最大的功利是当您传
入”xxxx/3/0″,会博得xxxx年六月的最终一天,它会自行判断当年是还是不是是闰年来回到28或29,不用自己判断,太方便了!!所以,我们想获取接纳年选拔月有稍许天的话,只要求

var d=new Date(“选择年/选择月+1/0”);alert(d.getDate());

上面是利用Javascript编写的收获某年某月有微微天的getDaysInOneMonth(year,
month)方法:

function getDaysInOneMonth(year, month){  
     month = parseInt(month,10)+1;  
     var d= new Date(year+"/"+month+"/0");  
     return d.getDate();  
  } 

Chrome浏览器(谷歌(Google)浏览器)对这么些特性不接济,得到的结果是NAN。包容性难题啊!其缘由就是非标准日期格式。

ECMAScript,改成如下的格式就OK:

function getDaysInMonth(year,month){
  var month = parseInt(month,10);
  var temp = new Date(year,month,0);
  return temp.getDate();
}
console.log(getDaysInMonth(2017,2)); //28 

2.js取得某年某月的哪些天是周四和周二

<div id="text"></div>
<script type="text/javascript">
    function time(y,m){
    var tempTime = new Date(y,m,0);
    var time = new Date();
    var saturday = new Array();
    var sunday = new Array();
    for(var i=1;i<=tempTime.getDate();i++){
        var ss = time.setFullYear(y,m-1,i);
        var day = time.getDay();
        if(day == 6){
            saturday.push(i);
        }else if(day == 0){
            sunday.push(i);
        }
    }
    var text = y+"年"+m+"月份"+"<br />"
                +"周六:"+saturday.toString()+"<br />"
                +"周日:"+sunday.toString();
    document.getElementById("text").innerHTML = text;
}

time(2017,2);
</script>

3.应用JavaScript生成一个倒数7天的数组

描述:

诸如前几天是三月1号,生成的数组是[“9月25号”,”9月26号”,”9月27号”,”9月28号”,”9月29号”,”9月30号”,”10月1号”]。那几个困难就是要求判定这一个月份(可能还亟需上一个月份)是30天仍然31天,而且还有瑞年的3月28天或者29天。

方法一:
不要求那么复杂,在js中万分简单,因为js的date对象是可以参预数学运算的!!!看下边的代码:

var now = new Date('2012/3/2 12:00:00'); 
var s = '';
var i = 0;
while (i < 7) {
    s += now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate() + '\n';

    // 这个是关键!!!减去一天的毫秒数效果就是把日期往前推一天
    now = new Date(now - 24 * 60 * 60 * 1000);
    i++;
}
console.log(s);

结果:

2012/3/2
2012/3/1
2012/2/29
2012/2/28
2012/2/27
2012/2/26
2012/2/25

方法二:
基于当下系统时间,来总结那些尾数7天的数组:

var now = new Date(); 
var s = '';
var i = 0;
while (i < 7) {
    s += now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate() + '\n';

    // 这个是关键!!!减去一天的毫秒数效果就是把日期往前推一天
    now = new Date(now - 24 * 60 * 60 * 1000); 
    i++;
}
console.log(s);

结果:

2017/6/2
2017/6/1
2017/5/31
2017/5/30
2017/5/29
2017/5/28
2017/5/27

方法三:
用Date 的 setDate()方法

var today = new Date();
var curday = today.getFullYear() +"/" + Number(today.getMonth() + 1) +"/"+ today.getDate(); //2017/11/9
var dates = [curday];
for (var i = 1; i < 7; i++) {
    var d = new Date(today);
    d.setDate(d.getDate() - i);
       var ss = d.getFullYear() +"/" + Number(d.getMonth() + 1) +"/"+ d.getDate();
    dates.unshift(ss);
}
console.log(dates);

结果:

["2017/11/3", "2017/11/4", "2017/11/5", "2017/11/6", "2017/11/7", "2017/11/8", "2017/11/9"]

注:setDate() 方法用于安装一个月的某一天。
getDate() 方法可再次回到月份的某一天。
unshift() 方法可向数组的始发添加一个或越多因素,并回到新的长度。

4.js收获上一个月、下一个月格式为yyyy-mm-dd的日期

function GetMonthFun(){}

//date的日期格式为 yyyyy-mm-dd
GetMonthFun.prototype.getPrevMonth = function(date){
    var arr = date.split('-');
    var year = arr[0]; //获取当前日期的年份
    var month = arr[1]; //获取当前日期的月份
    var day = arr[2]; //获取当前日期的日
    var days = new Date(year, month, 0);
    days = days.getDate(); //获取当前日期中月的天数
    var year2 = year;
    var month2 = parseInt(month) - 1;
    if (month2 == 0) {
        year2 = parseInt(year2) - 1;
        month2 = 12;
    }
    var day2 = day;
    var days2 = new Date(year2, month2, 0);
    days2 = days2.getDate();
    if (day2 > days2) {
        day2 = days2;
    }
    if (month2 < 10) {
        month2 = '0' + month2;
    }
    var t2 = year2 + '-' + month2 + '-' + day2;
    return t2;
}

//date的日期格式为 yyyyy-mm-dd
GetMonthFun.prototype.getNextMonth = function(date){
    var arr = date.split('-');
    var year = arr[0]; //获取当前日期的年份
    var month = arr[1]; //获取当前日期的月份
    var day = arr[2]; //获取当前日期的日
    var days = new Date(year, month, 0);
    days = days.getDate(); //获取当前日期中的月的天数
    var year2 = year;
    var month2 = parseInt(month) + 1;
    if (month2 == 13) {
        year2 = parseInt(year2) + 1;
        month2 = 1;
    }
    var day2 = day;
    var days2 = new Date(year2, month2, 0);
    days2 = days2.getDate();
    if (day2 > days2) {
        day2 = days2;
    }
    if (month2 < 10) {
        month2 = '0' + month2;
    }

    var t2 = year2 + '-' + month2 + '-' + day2;
    return t2;
}

var dateObj = new GetMonthFun();
console.log(dateObj.getPrevMonth('2014-01-25')); //2013-12-25
console.log(dateObj.getNextMonth('2014-10-31')); //2014-11-30