从屌丝到架构师的飞越(JavaScript篇)-Date对象

一、介绍

这节课呢,我们来了解的是JavaScript的内置对象中的Date(日期)对象。

从字面上就能理解,日期对象就是用于处理日期和时间。

二、知识点介绍

1、创建日期

2、Date对象的常用方法

三、上课对应视频的说明文档

1、创建日期

Date 对象用于处理日期和时间。

可以通过 new 关键词来定义 Date 对象。以下代码定义了名为 myDate 的 Date 对象:

1.1、创建date对象(4种)

1.1.1、new Date() :返回当前的本地日期和时间

参数:无

返回值:{Date} 返回一个表示本地日期和时间的Date对象。

示例:

var dt = new Date();

console.log(dt); // => 返回一个表示本地日期和时间的Date对象

1.1.2、new Date(milliseconds) :把毫秒数转换为Date对象

参数:

①milliseconds {int} :毫秒数;表示从'1970/01/01 00:00:00'为起点,开始叠加的毫秒数。

注意:起点的时分秒还要加上当前所在的时区,北京时间的时区为东8区,起点时间实际为:'1970/01/01 08:00:00'

返回值:

{Date} 返回一个叠加后的Date对象。

示例:

var dt = new Date(1000 * 60 * 1); // 前进1分钟的毫秒数

console.log(dt); // => {Date}:1970/01/01 08:01:00

dt = new Date(-1000 * 60 * 1); // 倒退1分钟的毫秒数

console.log(dt); // => {Date}:1970/01/01 07:59:00

1.1.3、 new Date(dateStr) :把字符串转换为Date对象

参数:

①dateStr {string} :可转换为Date对象的字符串(可省略时间);字符串的格式主要有两种:

1) yyyy/MM/dd HH:mm:ss (推荐):若省略时间,返回的Date对象的时间为 00:00:00。

2) yyyy-MM-dd HH:mm:ss :若省略时间,返回的Date对象的时间为 08:00:00(加上本地时区)。若不省略时间,此字符串在IE中会转换失败!

返回值:

{Date} 返回一个转换后的Date对象。

示例:

var dt = new Date('2014/12/25'); // yyyy/MM/dd

console.log(dt); // => {Date}:2014/12/25 00:00:00

dt = new Date('2014/12/25 12:00:00'); // yyyy/MM/dd HH:mm:ss

console.log(dt); // => {Date}:2014/12/25 12:00:00

dt = new Date('2014-12-25'); // yyyy-MM-dd

console.log(dt); // => {Date}:2014-12-25 08:00:00 (加上了东8区的时区)

dt = new Date('2014-12-25 12:00:00'); // yyyy-MM-dd HH:mm:ss (注意:此转换方式在IE中会报错!)

console.log(dt); // => {Date}:2014-12-25 12:00:00

1.1.4、 new Date(year, month, opt_day, opt_hours, opt_minutes, opt_seconds, opt_milliseconds) :把年月日、时分秒转换为Date对象

参数:

①year {int} :年份;4位数字。如:1999、2014

②month {int} :月份;2位数字。从0开始计算,0表示1月份、11表示12月份。

③opt_day {int} 可选:号; 2位数字;从1开始计算,1表示1号。

④opt_hours {int} 可选:时;2位数字;取值0~23。

⑤opt_minutes {int} 可选:分;2位数字;取值0~59。

⑥opt_seconds {int} 可选:秒;2未数字;取值0~59。

⑦opt_milliseconds {int} 可选:毫秒;取值0~999。

返回值:

{Date} 返回一个转换后的Date对象。

示例:

var dt = new Date(2014, 11); // 2014年12月(这里输入的月份数字为11)

console.log(dt); // => {Date}:2014/12/01 00:00:00

dt = new Date(2014, 11, 25); // 2014年12月25日

console.log(dt); // => {Date}:2014/12/25 00:00:00

dt = new Date(2014, 11, 25, 15, 30, 40); // 2014年12月25日 15点30分40秒

console.log(dt); // => {Date}:2014/12/25 15:30:40

dt = new Date(2014, 12, 25); // 2014年13月25日(这里输入的月份数字为12,表示第13个月,跳转到第二年的1月)

console.log(dt); // => {Date}:2015/01/25

1.2设置日期

通过使用针对日期对象的方法,我们可以很容易地对日期进行操作。

在下面的例子中,我们为日期对象设置了一个特定的日期 (2010 年 1 月 14 日):

var myDate=new Date();

myDate.setFullYear(2010,0,14);

在下面的例子中,我们将日期对象设置为 5 天后的日期:

var myDate=new Date();

myDate.setDate(myDate.getDate()+5);

注意: 如果增加天数会改变月份或者年份,那么日期对象会自动完成这种转换。

1.3、两个日期比较

日期对象也可用于比较两个日期。

下面的代码将当前日期与 2100 年 1 月 14 日做了比较:

var x=new Date();

x.setFullYear(2100,0,14);var today = new Date();

if (x>today){

alert("今天是2100年1月14日之前");}else{

alert("今天是2100年1月14日之后");}

2、date对象常用方法

2.1、创建Date对象

代码如下:

var myDate = new Date();

代码如下:

var myDate = new Date("July 21, 1983 01:15:00");//此种方法为自定义日期时间的方式,格式若不对的话为提示Invalid Date

Date对象的constructor属性为:Date

document.write(myDate.constructor == Date);//输出true

2.2、Date()方法,返回今天的日期和时间,格式是固定格式:

代码如下:

document.write(Date());//Date()属于Javascript的内置对象,可以直接使用

输出:Fri Oct 26 2012 10:15:22 GMT+0800

格式: 星期 月份 日期 年份 时间 时区

另:假如自定义一个Date()对象,返回结果是一样的

代码如下:

var myDate = new Date();

document.write(myDate);

Fri Oct 26 2012 10:17:09 GMT+0800

注:两者区别的地方在于:

前者只能显示当前的时间,而不能随意定义时间

例,document.write(Date("July 21, 1983 01:15:00"));

它显示的时间仍然是当前的时间:Fri Oct 26 2012 10:15:22 GMT+0800

2.3、getDate()方法返回月份的某一天

月份中的某一天指的是使用本地时间,其返回值是 1 ~ 31 之间的一个整数。

代码如下:

var myDate = new Date();

document.write(myDate.getDate());

输出:26

代码如下:

var myDate = new Date("July 21, 1983 01:15:00");

document.write(myDate.getDate());

输出:21

2.4、getDay() 方法可返回表示星期的某一天的数字,它的取值范围:0--6

复制代码代码如下:

var myDate = new Date("July 21, 1983 01:15:00");

document.write(mtDate.getDay());

输出4

为此我们可以采用Date对象和Array对象结合的方式将时间人性化显示出来,下面这种方法非常常用

代码如下:

var weekday = new Array(7);

weekday[0]="Sunday";

weekday[1]="Monday";

weekday[2]="Tuesday";

weekday[3]="Wednesday";

weekday[4]="Thursday";

weekday[5]="Friday";

weekday[6]="Saturday";

var myDate = new Date();

document.write(weekday[myDate.getDay()]);

2.5、getMonth(),返回月份字段,返回值是 0(一月) 到 11(十二月) 之间的一个整数

和getDay()类似,我们也采用与Array对象相结合的方式

代码如下:

var d=new Date();

var month=new Array(12);

month[0]="January";

month[1]="February";

month[2]="March";

month[3]="April";

month[4]="May";

month[5]="June";

month[6]="July";

month[7]="August";

month[8]="September";

month[9]="October";

month[10]="November";

month[11]="December";

document.write("The month is " + month[d.getMonth()]);

2.6、getFullYear() 方法可返回一个表示年份的 4 位数字。

返回值是一个四位数,表示包括世纪值在内的完整年份,而不是两位数的缩写形式。

代码如下:

var d = new Date();

document.write(d.getFullYear());

输出:2012

代码如下:

var born = new Date("July 21, 1983 01:15:00");

document.write("I was born in " + born.getFullYear());

输出:1983

通过上述方法三种方法结合我们就可以得出比较人性化的时间显示,例:

代码如下:

var weekday = new Array(7);

weekday[0]="Sunday"

weekday[1]="Monday"

weekday[2]="Tuesday"

weekday[3]="Wednesday"

weekday[4]="Thursday"

weekday[5]="Friday"

weekday[6]="Saturday"

var month=new Array(12);

month[0]="January";

month[1]="February";

month[2]="March";

month[3]="April";

month[4]="May";

month[5]="June";

month[6]="July";

month[7]="August";

month[8]="September";

month[9]="October";

month[10]="November";

month[11]="December";

var myDate = new Date();

document.write("Date is "+myDate.getFullYear()+" "+month[myDate.getMonth()]+" "+myDate.getDate()+" "+weekday[myDate.getDay()]);

输出为:Date is 2012 October 19 Friday

2.7、getHours() 方法可返回时间的小时字段,返回值是 0 (午夜) 到 23 (晚上 11 点)之间的一个整数。

代码如下:

var born = new Date("July 21, 1983 01:15:00");

document.write(born.getHours());

输出:1

注释:由 getHours() 返回的值是一个两位的数字。

不过返回值不总是两位的,如果该值小于 10,则仅返回一位数字。

2.8、getMinutes() 方法可返回时间的分钟字段,返回值是 0 ~ 59 之间的一个整数。

与上述方法类似,返回值不总是两位的,如果该值小于 10,则仅返回一位数字。

2.9、getSeconds() 方法可返回时间的秒,返回值是 0 ~ 59 之间的一个整数。

与上述方法类似,返回值不总是两位的,如果该值小于 10,则仅返回一位数字。

2.10、getMilliseconds() 方法可返回时间的毫秒,毫秒字段,以本地时间显示。返回值是 0 ~ 999 之间的一个整数。

注释:由 getMilliseconds() 返回的值是一个三位的数字。

不过返回值不总是三位的,如果该值小于 100,则仅返回两位数字,如果该值小于 10,则仅返回一位数字。

下面我们有两种方式将时间显示出来:

--->方式一

复制代码代码如下:

var d = new Date();

document.write('Time is '+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds());

输出:Time is 10:52:2,缺点很明显,在秒为<10的情况下只显示了一位,其他的也类似,因此推荐第二种显示方式

--->方式二

代码如下:

function checktime(time)

{

if(time<10)

{

time = '0'+time;

}

return time;

}

var d = new Date();

document.write('Time is '+checktime(d.getHours())+":"+checktime(d.getMinutes())+":"+checktime(d.getSeconds()));

输出:Time is 10:55:02

2.11、getTime() 方法可返回本地时间距 1970 年 1 月 1 日之间的毫秒数,因此可以自定义Date("Jul 26 2000");

代码如下:

var d = new Date();

document.write(d.getTime() + " milliseconds since 1970/01/01");

输出:1350615452813 milliseconds since 1970/01/01

因此我们可以根据此数得到本地时间距离1970/01/01的年数

代码如下:

var minutes = 1000*60;//一分钟有60秒,一秒有60毫秒,下面依次类推

var hours = minutes*60;

var days = hours*24;

var years = days*365;

var d = new Date();

var t = d.getTime();//获得距离1970/01/01的毫秒数

var y = t/years;

document.write("It's been: " + y + " years since 1970/01/01!");

输出:It's been: 42.82773990521943 years since 1970/01/01!

注:此时的年份是一个小数,可以将其换成整数(其实Javascript中没有整数的区别)

最后一行修改为:

代码如下:

document.write("It's been: " + parseInt(y) + " years since 1970/01/01!");

输出:It's been: 42 years since 1970/01/01!

parseInt(float);可以将浮点类型转换为整型

2.12、getTimezoneOffset() 方法可返回格林威治时间和本地时间之间的时差,以分钟为单位。

注:

getTimezoneOffset() 方法返回的是本地时间与 GMT 时间或 UTC 时间之间相差的分钟数。

实际上,该函数告诉我们运行 JavaScript 代码的时区,以及指定的时间是否是夏令时。

返回之所以以分钟计,而不是以小时计,原因是某些国家所占有的时区甚至不到一个小时的间隔。

代码如下:

var d = new Date();

document.write(d.getTimezoneOffset());

输出:-480(东八区,8*60)

因此可以根据此方法来判断所在时区

代码如下:

function checkzone(zone)

{

if (zone==0)

{

return "零时区";

}

else if (zone>0)

{

return "西"+parseInt(zone/60)+"区";

}

else

{

return "东"+parseInt(Math.abs(zone/60))+"区";

}

}

var d = new Date();

document.write(checkzone(d.getTimezoneOffset()));

其中Math.abs()为求绝对值

2.13、parse() 方法可解析一个日期时间字符串,并返回 1970/1/1 午夜距离该日期时间的毫秒数。

parse(str);str为字符串,是一个符合时间格式的字符串

代码如下:

var minutes = 1000 * 60;

var hours = minutes * 60;

var days = hours * 24;

var years = days * 365;

var t = Date.parse("Jul 8, 2005");

var y = t/years;

document.write("It's been: " + parseInt(y) + " years from 1970/01/01");

document.write(" to 2005/07/08!");

输出为:It's been: 35 years from 1970/01/01 to 2005/07/08!

2.14、setDate() 方法用于设置一个月的某一天。

setDate(day),day必需。表示一个月中的一天的一个数值(1 ~ 31)。

注,此方法是在原先对象的基础上进行修改,会改变原先数据的值

例:

代码如下:

var d = new Date();

document.write(d.getDate()+"<br>");

d.setDate(31);

document.write(d.getDate());

输出:19 31

2.15、setMonth() 方法用于设置月份,与setDate()使用方法一直,也会改变原Date对象

setMonth(month,day),目前可能不支持第二个参数,month必需。一个表示月份的数值,该值介于 0(一月) ~ 11(十二月) 之间。

假如支持day参数的话,day代表的是月中某一天的数值,介于 1 ~ 31 之间。用本地时间表示。

代码如下:

var d = new Date();

document.write(d.getMonth()+" "+d.getDate()+"<br>");

d.setMonth(11,26);

document.write(d.getMonth()+" "+d.getDate());

输出为:9 19 11 26

2.16、setFullYear() 方法用于设置年份。

setFullYear(year,month,day);

year 必需。表示年份的四位整数。用本地时间表示。

month 可选。表示月份的数值,介于 0 ~ 11 之间。用本地时间表示。

day 可选。表示月中某一天的数值,介于 1 ~ 31 之间。用本地时间表示。

代码如下:

var d = new Date();

d.setFullYear(1992,10,3);

document.write(d);

输出为:Tue Nov 03 1992 11:31:58 GMT+0800

2.17、setHours() 方法用于设置指定的时间的小时字段。

setHours(hour,min,sec,millisec);

hour 必需。表示小时的数值,介于 0(午夜) ~ 23(晚上11点) 之间,以本地时间计(下同)。

min 可选。表示分钟的数值,介于 0 ~ 59 之间。在 EMCAScript 标准化之前,不支持该参数。

sec 可选。表示秒的数值,介于 0 ~ 59 之间。在 EMCAScript 标准化之前,不支持该参数。

millisec 可选。表示毫秒的数值,介于 0 ~ 999之间。在 EMCAScript 标准化之前,不支持该参数。

代码如下:

var d = new Date()

d.setHours(15,35,1)

document.write(d)

输出为:Fri Oct 19 15:35:01 UTC+0800 2012

2.18、setMinutes() 方法用于设置指定时间的分钟字段。

setMinutes(min,sec,millisec)

min 必需。表示分钟的数值,介于 0 ~ 59 之间,以本地时间计(下同)。

sec 可选。表示秒的数值,介于 0 ~ 59 之间。在 EMCAScript 标准化之前,不支持该参数。

millisec 可选。表示毫秒的数值,介于 0 ~ 999 之间。在 EMCAScript 标准化之前,不支持该参数。

代码如下:

var d = new Date()

d.setMinutes(1)

document.write(d)

输出为:Fri Oct 19 11:01:11 UTC+0800 2012

2.19、setSeconds() 方法用于设置指定时间的秒字段。

setSeconds(sec,millisec)

sec 必需。表示秒的数值,该值是介于 0 ~ 59 之间的整数。

millisec 可选。表示毫秒的数值,介于 0 ~ 999 之间。在 EMCAScript 标准化之前,不支持该参数。

2.20、setMilliseconds() 方法用于设置指定时间的毫秒字段。

setMilliseconds(millisec)

millisec 必需。用于设置 dateObject 毫秒字段,该参数是介于 0 ~ 999 之间的整数。

2.21、setTime() 方法以毫秒设置 Date 对象。

此方法是比较常用的方法,在数据库中存放Date.getTime()毫秒数,

在返回时如何显示出来呢,就是用此方法

setTime(millisec)

millisec 必需。要设置的日期和时间据 GMT 时间 1997 年 1 月 1 日午夜之间的毫秒数。

这种类型的毫秒值可以传递给 Date() 构造函数,可以通过调用 Date.UTC() 和 Date.parse() 方法获得该值。以毫秒形式表示日期可以使它独立于时区。

代码如下:

var d = new Date();

d.setTime(77771564221);

document.write(d);

输出为:Mon Jun 19 1972 11:12:44 GMT+0800

此种方法就可以根据数据库中存放的long数据类型将其转换为了时间对象

2.22、toTimeString() 方法可把 Date 对象的时间部分转换为字符串,并返回结果。

代码如下:

var d = new Date();

document.write(d.toTimeString());

输出:11:50:57 GMT+0800

2.23、toDateString() 方法可把 Date 对象的日期部分转换为字符串,并返回结果。

代码如下:

var d = new Date();

document.write(d.toDateString());

输出:Fri Oct 19 2012

3、实例

实例一:

计算合同到期时间等

要求:①创建Date对象保存员工入职日期;

②合同有效期为3年,计算合同到期时间;

③合同到期前,需要提前一个月续签。如果提前一月的续签时间刚好是周末,则需要提前到上一个周五,计算续签时间;

④要求在续签时间前一周,向员工发出续签提醒,计算提醒时间。

//入职时间var hireDate = new Date("2012/6/30");//赋值对象给endDatevar endDate = new Date(hireDate.getTime());

endDate.setFullYear(endDate.getFullYear()+3);//var resumeDate = new Date(endDate.getTime());

resumeDate.setMonth(resumeDate.getMonth()-1);if(resumeDate.getDay()==6){

resumeDate.setDate(resumeDate.getDate()-1);

}if(resumeDate.getDay()==0){

resumeDate.setDate(resumeDate.getDate()-2);

}var alertDate = new Date(resumeDate.getTime());

alertDate.setDate(alertDate.getDate()-7);

console.log("到期时间:"+endDate.toLocaleDateString());

console.log("续签时间:"+resumeDate.toLocaleDateString());

console.log("提醒时间:"+alertDate.toLocaleDateString());

实例二:

计算明天开始,任意工作日之后的日期

var now = new Date();var days = 10;for(var i=0;i<days;i++){

/*if(now.getDay()==5){

now.setDate(now.getDate()+2);

}else if(now.getDay()==6){

now.setDate(now.getDate()+1);

}

now.setDate(now.getDate()+1);*/

//简写

now.setDate(now.getDate() + (now.getDay()==5 ? 3 : now.getDay()==6 ? 2 : 1));

}

console.log(now.toLocaleDateString());

实例三:

自定义format方法,格式化日期

//返回形如“2017年3月2日 星期四 上午 11:12:31”function format (date){

var days = ["星期日","星期一","星期二","星期三","星期四","星期五","星期6"];

//获取date的年份

var year = date.getFullYear();

//获取date的月份,将月份格式化成两位数保存

var month = date.getMonth()<10 ? "0"+date.getMonth() : date.getMonth();

//获取date的日期,将日期格式化成两位数保存

var d = date.getDate()<10 ? "0"+date.getDate() : date.getDate();

//从days数组中获得date的星期对应位置的星期名

var day = days[date.getDay()];

//获得date的小时,保存为两位数

var hour = date.getHours();

var am = hour<12 ? "上午" : "下午";

hour = hour<12 ? hour : hour-12;

var minute = date.getMinutes();

var second = date.getSeconds();

return year+"年"+month+"月"+d+"日 "+day+" "+am+" "+hour+":"+minute+":"+second;

}

console.log(format(new Date()));

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,612评论 5 471
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,345评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,625评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,022评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,974评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,227评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,688评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,358评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,490评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,402评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,446评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,721评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,802评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,013评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,504评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,080评论 2 341

推荐阅读更多精彩内容