JavaScript即学即用教程[4]-日期操作

本文来学习JavaScript内置的类型Date所提供的日期相关的功能。

UTC时间

这个我们可以大概将其理解为格林尼治天文台的标准时间即可。也就是0时区的时间。

他的全称是世界协调时。参考: 协调世界时

时间戳

时间戳(timestamp),一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。使用数字签名技术产生的数据, 签名的对象包括了原始文件信息、 签名参数、 签名时间等信息。广泛的运用在知识产权保护、 合同签字、 金融帐务、 电子报价投标、 股票交易等方面

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数

前端日期传递给服务器保存时,一般用日期对象的时间戳形式,因数据库中也是以number时间戳的形式存储时间的。

注意了,时间戳的单位是 “秒”。

而在JavaScript当中,Date.now(), (new Date().getTime()) 获取到的是1970起始到现在的毫秒数, 因此JS中一般要做除以1000的处理:

1
Math.round(new Date().getTime() / 1000)

后端传来的时间戳如何转换为日期对象呢?

1
var a = new Date(timeStamp)

不过要注意,服务端传来的是秒还是毫秒,并做对应的处理即可。

JavaScript API

获取当前日期的js日期对象

1
2
3
var today = new Date();
var today = new Date(1453094034000);// 时间戳
var birthday = new Date(1995,11,17,3,24,0); // 传入年、月、天、时、分、秒

第三个构造函数,如果不传月份就用一月,如果不传日,则用一号,时分秒不传则是0:0:0

举例:

1
new Date(2015,7,20,14,57,11) // 返回 2015-08-20T06:57:11.000Z, 其实会返回一个日期对象,打印的这个值只是UTC时间而已。

js日期对象内部存储的月份,是比我们通常认为的月份小1个月。

原型方法

get相关

1
2
3
4
5
6
Date.prototype.getFullYear // 年
Date.prototype.getMonth // 月
Date.prototype.getDate // 获取日,注意不是getDay,getDay是获取星期中的第几天
Date.prototype.getHours // 时
Date.prototype.getMinutes // 分
Date.prototype.getSeconds // 秒

set相关

1
2
3
4
5
6
Date.prototype.setFullYear // 年
Date.prototype.setMonth // 月
Date.prototype.setDate // 日
Date.prototype.setHours // 时
Date.prototype.setMinutes // 分
Date.prototype.setSeconds // 秒

setDate是支持设置超过30天的,当你设置的天超过一个月份时,则日期对象会自动推导成下个月。
setHours同理,设置超过24小时,也可以智能推导。

日期格式化

Date有些跟本地时区有关的toString方法,如:

1
2
Date.prototype.toLocaleDateString()
Date.prototype.toLocaleString()

分别表示:

  • 返回一个表示该日期对象日期部分的字符串,该字符串格式与系统设置的地区关联(locality sensitive)。
  • 返回一个表示该日期对象的字符串,该字符串与系统设置的地区关联(locality sensitive)

为了更加精准,跟平台无关,我们需要自己实现这个格式化方法:

1
2
3
4
5
6
7
8
var formatDate(date) {
return date.getFullYear() + '-'
+ padding(date.getMonth() + 1) + '-'
+ padding(date.getDate()) + ' '
+ padding(date.getHours()) + ':'
+ padding(date.getMinutes()) + ':'
+ padding(date.getSeconds());
}

对于个位数的月份,我们通常需要补0的操作。这里给出2种padding填补的实现:

1
2
3
4
5
6
7
8
方法1:
var padding = function (v) {
return v < 10 ? '0' + v : v;
}
方法2:
var padding = function (v) {
return ('0'+v).slice(-2)
}

第二种看起来思路比较666,不过相对于第一种存在内存空间浪费的情况。因为做字符串拼接创建了一次新字符串,slice又创建了一次新字符串。而方法1创建了一个返回字符串,甚至在v小于10的时候并不需要创建额外的新字符串。

获取某月份的天数

利用浏览器的智能推导。上文讲到了,如果设置一个日子超过当前月份天数,则Date对象会自动设置为下个月推导出来的天数。
同样,如果我设置一个月的第0天,则浏览器Date对象会自动设置为上个月的最后一天。

利用该原理,可以将日期设置下一个月的第0天,从而日期对象会自动设置为上个月的最后一天,从而得到了最后一天的日期,即是月份中的总天数。

例如: var a = new Date(2015,2,0)
相当于设置了一个日期对象为 2015年3月的第0天。
则实际上该日期对象内部存储为: 2015-02-27T16:00:00.000Z。 因此,可知2015年2月共有27天。

函数实现:

1
2
3
4
var getDays (year, month) {
var date = new Date(year, month, 0)
return date.getDate()
}

广告Time

waiting