ECMAScript时间与日期

ECMAScript提供了Date类型来处理时间和日期。Date类型内置一系列获取和设置日期时间信息的方法。
一.Date类型
ECMAScript中的Date类型是在早期Java中java.util.Date类基础上构建的。为此,Date类型使用UTC(Coordinated Universal Time,国际协调时间[又称世界统一时间])1970年1月1日午夜(零时)开始经过的毫秒来保存日期。在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日之前或之后的285616年。
创建一个日期对象,使用new运算符和Date构造方法(构造函数)即可。

var box=new Date();  //创建了一个日期对象,构造方法里面可以传参数,指定时间,如果没有传,就是默认当前的时间
alert(box);          //打印出来:Wed Nov 2017 22:51:54 GMT+0800

在调用Date构造方法而不传递参数的情况下,新建的对象自动获取当前的时间和日期。
ECMAScript提供了两个方法,Date.parse()和 Date.UTC()。Date.parse()方法接收一个表示日期的字符串参数,然后尝试根据这个字符串返回相应的毫秒数。ECMA-262没有定义Date.parse()应该支持哪种日期格式,因此方法的行为因实现而异,因地区而异。默认通常接
收的日期格式如下:
1.'月/日/年',如 6/13/2011;

alert(Date.parse('4/12/2017'));                    //返回的是一个毫秒数1176307200000
var box = new Date(Date.parse('4/12/2017'));    //把毫秒数转换成看的懂的时间
alert(box);                                     //Thu Apr 12 2017 00:00:00 GMT+0800
var box = new Date(1176307200000);      //直接放日期的毫秒数也是可以的。
alert(box);                             //Thu Apr 12 2017 00:00:00 GMT+0800

如果想输出指定的日期,那么把Date.parse()传入Date构造方法里

var box = new Date('4/12/2007');       //默认自动后台调用Data.parse()
alert(box);                            //Thu Apr 12 2017 00:00:00 GMT+0800

如果ate.parse()没有传入或者不是标准的日期格式,那么就会返回NaN。

alert(Date.parse());        //没有传入日期格式参数,返回NaN
//火狐返回Invalid Date(无效的日期)
//谷歌返回一个混乱的日期
//IE返回一个NaN
var box = new Date('msdfkl 21123');         //乱写的日期格式,会返回Invalid Date(无效的日期)
alert(box);

2.'英文月名 日, 年',如 May 25, 2004;

var box = new Date('May 25, 2007');          //第二种写法
alert(box);

3.'英文星期几 英文月名 日 年 时:分:秒 时区',如Tue May 25 2004

var box = new Date('Thu Apr 12 2007 22:22:22 GMT+0800');    //第三种写法(必须字符串形式)
alert(box);

注意:
Date对象及其在不同浏览器中的实现有许多奇怪的行为。其中有一种倾向是将超出的范围的值替换成当前的值,以便生成输出。例如,在解析“January 32, 2007”时,有的浏览器会讲其解释为“February 1, 2007”。而 Opera则倾向与插入当前月份的当前日期。

var box = new Date('January 32, 2007');
alert(box);
//1月没有32号,只有31号,多出来的,可以进到2月
//火狐2月1号向后增加+1
//谷歌Invalid Date(无效的日期)
//IE2月1号
//Opera是1月30号   向前减少-1

Date.UTC()方法同样也返回表示日期的毫秒数,但它与Date.parse()在构建值时使用不同的信息。(年份,基 0的月份[0表示1月,1表示2月],月中的哪一天[1-31],小时数[0-23],分钟,秒以及毫秒)。只有前两个参数是必须的。如果没有提供月数,则天数为1;如果省略其他参数,则统统为0

alert(Date.UTC());            //错误:必须传入年份和月份,不传,就各种错误,负值,有NaN
alert(Date.UTC(2007,10));    //正确:返回毫秒数

UTC世界协调时间,他会按照他的区域基准来计算

var box = new Date(Date.UTC(2007, 10, 15, 17, 22, 45, 15));
alert(box);

如果不加Date.UTC,那么就会返回本地的时间

var box = new Date(2007, 10, 15, 17, 22, 45, 15);
alert(box);

二.通用的方法
与其他类型一样,Date类型也重写了toLocaleString()、toString()和valueOf()方法;但这些方法返回值与其他类型中的方法不同。

var box = new Date(2017, 10, 15, 17, 22, 45, 15);
alert(box);                                                     //本身返回:Thu Nov 15 2017 17:22:45 GMT+0800
alert('toString:' + box.toString());                            //toString方法返回:Thu Nov 15 2017 17:22:45 GMT+0800 
alert('toLocaleString:' + box.toLocaleString());                //toLocaleString按本地格式输出:2017-11-15 17:22:45 PS谷歌返回的Thu Nov 15 2017 17:22:45 GMT+0800 
alert('valueOf:' + box.valueOf());                              //'valueOf返回毫秒数

这两个方法在不同浏览器显示的效果又不一样,但不用担心,这两个方法只是在调试比较有用,在显示时间和日期上,没什么价值。valueOf()方法显示毫秒数。

三.日期格式化方法
Date类型还有一些专门用于将日期格式化为字符串的方法

var box = new Date(2017, 10, 15, 17, 22, 45, 15);
alert(box.toDateString());                     //以特定的格式显示星期几、月、日和年:Thu Nov 15 2017
alert(box.toTimeString());                     //以特定的格式显示时、分、秒和时区:17:22:45 GMT+0800
alert(box.toLocaleDateString());               //以特定地区格式显示星期几、月、日和年:2017-11-15
alert(box.toLocaleTimeString());               //以特定地区格式显示时、分、秒和时区:17:22:45
alert(box.toUTCString());                      //以特定的格式显示完整的UTC日期:Thu Nov 15 2017 09:22:45 GMT

四.组件方法
组件方法,是为我们单独获取你想要的各种时间/日期而提供的方法。需要注意的时候,这些方法中,有带UTC的,有不带UTC的。UTC日期指的是在没有时区偏差的情况下的日期值。

var box = new Date(2017, 10, 15, 17, 22, 45, 15);
box.setTime(100);               //以毫秒数设置日期,会改变整个日期
alert(box.getTime());           //获取日期的毫秒数,和valueOf()返回一致
var box = new Date(2017, 10, 15, 17, 22, 45, 15);
box.setFullYear(2018);          //设置四位年份2018,返回的是毫秒数
alert(box.getFullYear());       //获取四位年份:2019
var box = new Date(2017, 10, 15, 17, 22, 45, 15);
alert(box.getMonth() + 1);      //月份要加1才是最终的月份
var box = new Date(2017, 10, 15, 17, 22, 45, 15);
box.setMonth(5);                //设置月份为5月
alert(box.getMonth());          //获取月份,没指定月份,从0开始算起

alert(box.getDate());    //获取日期
alert(box.setDate(8));   //设置日期,返回毫秒数
alert(box.getDay());     //返回星期几,0 表示星期日,6 表示星期六
alert(box.setDay(2));    //设置星期几
alert(box.getHours());   //返回时
alert(box.setHours(12)); //设置时
alert(box.getMinutes()); //返回分钟
alert(box.setMinutes(22)); //设置分钟
alert(box.getSeconds());   //返回秒数
alert(box.setSeconds(44)); //设置秒数
alert(box.getMilliseconds());   //返回毫秒数
alert(box.setMilliseconds());   //设置毫秒数

var box = new Date(2017, 10, 15, 10, 22, 45, 15);
alert(box.getTimezoneOffset());            //返回本地时间和UTC时间相差的分钟数

以上方法除了getTimezoneOffset(),其他都具有 UTC 功能,例如setDate()及getDate()获取星期几,那么就会有setUTCDate()及getUTCDate()。表示世界协调时间。
所有getUTCHous和getHous相差8个小时

var box = new Date(2017, 10, 15, 17, 22, 45, 15);
alert(box.getUTCHours());             //东八区有8个小时的差距

调用出当前时间

var box = new Date();
alert(box.getFullYear()+'-'+box.getMonth()+'-'+box.getDate()+''+box.getHours()+':'+box.getMinutes()+':'+box.getSeconds());
//当前时间:2017-10-30 23:40:36
posted on 2018-03-18 17:26  我不是西西  阅读(828)  评论(0)    收藏  举报