## Date类型 在JavaScript中,Date类型是用来保存日期的,它能精确到1970年1月1日之前或之后的285616年。 **1、创建日期对象** 要创建一个日期对象,使用new操作符和Date构造函数即可: ``` var now = new Date(); ``` 在调用Date构造函数而不传递参数时,新创建的对象自动获得当前日期和时间。 如果要根据特定的日期和时间创建日期对象,必须传入表示该日期的毫秒数(即从UTC时间1970年1月1日起至该日期止经过的毫秒数) 注意:如果给Date构造函数传入的是其他格式,也会在后台调用Date.parse(),将其转换成毫秒数。 **1.1 Date.parse()** Date.parse()接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应日期的毫秒数。 将地区设置为美国的浏览器,通常可以接受下列日期格式: - “月/日/年”,如11/11/2016 - “英文月名 日,年”,如 January 12,2016 - “英文星期几 英文月名 日 年 时:分:秒 时区”,如Tue May 25 2016 00:00:00 GMT-0700 - ISO 8601扩展格式 YYYY-MM-DDTHH:mm:ss:sssZ,如2016-11-11T00:00:00。兼容ECMAScript 5的浏览器支持这种格式。 ``` var someDate = new Date(Date.parse('2016-11-11')); //Fri Nov 11 2016 08:00:00 GMT+0800 (中国标准时间) ``` 如果传入Date.parse()方法的字符串不能表示日期,则会返回NaN。 前面说过:如果给Date构造函数传入的是其他格式,也会在后台调用Date.parse(),将其转换成毫秒数,所以我们也可以这样设置: ``` var someDate = new Date('2016-11-11'); //Fri Nov 11 2016 08:00:00 GMT+0800 (中国标准时间) ``` **1.2 Date.UTC()** Date.UTC()同样能返回表示日期的毫秒数。不过,它传入的参数有所不同,分别是年份、基于0的月份(一月是0,二月是1,以此类推)、月中的哪一天(1到31)、小时数(0到23)、分钟、秒数以及毫秒数,只有前两个参数是必须的。如果没有提供月中的天数,则假设天数为1。如省略其他参数,默认为0. ``` var y2k = new Date(Date.UTC(2016,0)); //Fri Jan 01 2016 08:00:00 GMT+0800 (中国标准时间) var someDate = new Date(Date.UTC(2016, 0, 1, 0, 0, 0)); //Fri Jan 01 2016 08:00:00 GMT+0800 (中国标准时间) ``` 上面的y2k和someDate是等价的。 如同模仿Date.parse()一样,Date构造函数也会模仿Date.UTC(),它会基于本地时区来创建。 ``` var y2k = new Date(2016, 0) var someDate = new Date(2016, 0, 1, 0, 0, 0); ``` 上面两个是等价的。 **1.3 Date.now()** Date.now()返回表示调用这个方法时的日期和时间的毫秒数。 ``` var times = Date.now(); //1479438986198 ``` 我们也可以使用+操作符实现Date.now()的功能: ``` var times2 = +new Date(); //1479438986198 ``` **2、Date实例对象的方法** **2.1 继承的方法** **(1)toLocaleString()** Date类型的toLocaleString()方法会按照与浏览器设置的时区相适应的格式返回日期和时间,包含AM或PM,但不包含时区。 ``` var dateString = new Date(); console.log(dateString.toLocaleString()); // 2016/11/18 下午12:19:47 ``` **(2)toString()** Date类型的toString()返回带有时区信息的日期和时间,其中时间一般以军用时间(即小时的范围是0到23) ``` var dateString = new Date(); console.log(dateString.toString()); // Fri Nov 18 2016 12:19:47 GMT+0800 (中国标准时间) ``` **(3)valueOf()** Date类型的valueOf()返回日期的毫秒数,也就是返回Date实例本身。 ``` var dateString = new Date(); console.log(dateString.valueOf()); // 1479442787239 ``` **2.2 日期格式化方法** Date类型提供了一些将日期格式化为字符串的方法,如下: **(1)toDateString()** toDateString()方法返回格式为星期几、月、日和年的字符串。 ``` var dateString = new Date(); console.log(dateString.toDateString()); // Fri Nov 18 2016 ``` **(2)toTimeString()** toTimeString()返回格式为时、分、秒和时区的字符串 ``` var dateString = new Date(); console.log(dateString.toTimeString()); // 12:30:35 GMT+0800 (中国标准时间) ``` **(3)toLocaleDateString()** toLocaleDateString()返回格式为星期几、月、日和年的字符串(依照时区的不同,显示的格式也会所有不同) ``` var dateString = new Date(); console.log(dateString.toLocaleDateString()); // 2016/11/18 ``` **(4)toLocaleTimeString()** toLocaleTimeString() 返回格式为时、分、秒的字符串 ``` var dateString = new Date(); console.log(dateString.toLocaleTimeString()); // 下午12:30:35 ``` **(5)toUTCString()** toUTCString()返回完整的UTC日期 ``` var dateString = new Date(); console.log(dateString.toUTCString()); // Fri, 18 Nov 2016 04:30:35 GMT ``` **2.2 日期/时间组件方法** 日期/时间组件方法可分为两类: - get类方法:获取Date对象的日期和时间 - set类方法:设置Date对象的日期和时间 **2.2.1 get类方法** Date对象提供了一些获取日期和时间的方法: ``` getTime():返回距离1970年1月1日00:00:00的毫秒数,等同于valueOf方法。 getDate():返回实例对象对应每个月的几号(从1开始)。 getDay():返回星期几,星期日为0,星期一为1,以此类推。 getYear():返回距离1900的年数。 getFullYear():返回四位的年份。 getMonth():返回月份(0表示1月,11表示12月)。 getHours():返回小时(0-23)。 getMilliseconds():返回毫秒(0-999)。 getMinutes():返回分钟(0-59)。 getSeconds():返回秒(0-59)。 getTimezoneOffset():返回当前时间与UTC的时区差异,以分钟表示,返回结果考虑到了夏令时因素。 ``` 上面这些方法返回的都是正数,不同值返回的范围不一样: ``` 分钟和秒:0 到 59 小时:0 到 23 星期:0(星期天)到 6(星期六) 日期:1 到 31 月份:0(一月)到 11(十二月) 年份:距离1900年的年数 ``` 上面这些get类方法返回的都是当前时区的时间,Date对象还提供了这些方法对应的UTC版本,用来返回UTC时间。 ``` getUTCDate() getUTCFullYear() getUTCMonth() getUTCDay() getUTCHours() getUTCMinutes() getUTCSeconds() getUTCMilliseconds() ``` **2.2.2 set类方法** Date对象提供了一些设置日期和时间的方法: ``` setDate(date):设置实例对象对应的每个月的几号(1-31),返回改变后毫秒时间戳。 setYear(year): 设置距离1900年的年数。 setFullYear(year [, month, date]):设置四位年份。 setHours(hour [, min, sec, ms]):设置小时(0-23)。 setMilliseconds():设置毫秒(0-999)。 setMinutes(min [, sec, ms]):设置分钟(0-59)。 setMonth(month [, date]):设置月份(0-11)。 setSeconds(sec [, ms]):设置秒(0-59)。 setTime(milliseconds):设置毫秒时间戳。 ``` 注意:月份都是从0开始的。 set类方法的参数都会自动折算。下面以setDate为例,如果参数超过当月的最大天数,则向下一个月顺延,如果参数是负数,表示从上个月的最后一天开始减去的天数。 **(1)setDate()** 这里重点讲一些setDate()方法,平常用的比较多。 setDate()传入特殊值时: - 当传入0时,表示为上一个月的最后一天; - 当传入负数时,表示上一个月最后一天之前的第几天(比如-1表示上一个月最后一天之前的一天) - 当传入32时,如果当月有31天,32表示下个月的第一天;如果当月有30天,32表示为下一个月的第二天 传入32获取当月天数 ``` var now = new Date(); console.log(now); now.setDate(32); console.log(now); var aMontthDay = 32 - now.getDate(); console.log(aMonthDay); // Fri Nov 18 2016 13:13:03 GMT+0800 (中国标准时间) // Fri Dec 02 2016 13:13:03 GMT+0800 (中国标准时间) // 30 ``` set类方法也有对应的设置UTC时间的方法: ``` setUTCDate() setUTCFullYear() setUTCHours() setUTCMilliseconds() setUTCMinutes() setUTCMonth() setUTCSeconds() ```