Date 使用小结
Date 使用小结
一、介绍
ECMAAScript 中的 Date 类型是早期 Java 中的 java.util.Date 类基础上构建的。因此,Date类型使用自 UTC ( Coordinated Universal Time,国际协调时间,以本初子午线的平子夜起算的平太阳时。又称格林尼治平时或格林尼治时间。各地的地方平时与世界时之差等于该地的地理经度) 1970 年 1 月 1 日午夜(零时)开始经过的毫秒数来保存日期。在使用这种数据存储格式的条件下,Date 类型保存的日期能够精确到 1970 年 1 月 1 日之前或之后的 100 000 000 年。
二、创建指定时间的 Date
1. 当前时间
var now = new Date()
2. 非当前时间
Date 的构造函数支持传入一个时间毫秒数(从 1970年1月1 算起)参数来创建指点时间的 Date 实例。
有两个函数可以帮助我们生成指定毫秒数:Date.parse()
, Date.UTC()
1)Date.parse()
Date.parse() 通过传入字符串来生成对应的毫秒数,但是没有标准的实现规范,因此各地区表现有差异,如果页面会运行在不同的地区,可能需要谨慎的使用这个方法,做兼容处理。
将地区设置为美国的浏览器通常都接受下列的日期格式:
- “月/日/年”,如6/13/2004;
- “英文月名 日,年”,如January 12,2004;
- “英文星期几 英文月名 日 年 时:分:秒 时区”,如Tue May 25 2004 00:00:00 GMT-0700。
- “YYYY-MM-DDTHH:mm:ss:sssZ” :例如 2004-05-25T00:00:00,只有兼容 ECMAScript5 的实现支持这种格式。
如果传入Date.parse()方法的字符串不能表示日期,那么它会返回NaN。
如果直接给 new Date() 构造函数传入字符串,它会自动调用 Date.parse 来解析。
2)Date.UTC()
Date.parse(year, month, date, hours, minutes, second)
除了 year 和 date 其他都是从 0 开始算的,只有年和月是必须的
下面创建一个 GMT 时间 2005年5月5日下午5:55:55
var ms = Date.UTC(2005, 4, 5, 17, 55, 55) // 月份这里不太符合我们正常的写法
var date = new Date(ms)
data.toString() // "Fri May 06 2005 01:55:55 GMT+0800 (中国标准时间)"
注意上面这样创建是以格林尼治那边的时间作为参数输入的,由于格林尼治时间与我们所在的地方是有时区差的,GMT+0800
表示我所在的地区比格林尼治时间
早 8 小时,所以 我所在地区时间(即创建出来的时间) = 格林尼治时间(传入的参数) + 8 小时(地区时差) ,所以我们看到上面 date.toString() 的结果被加上了 8h ,并且由于时间超过了 24h 所以日期加 1 ,小时减 24
那我们要怎么以自己所在地区的时间作为参数创建时间呢?
可以直接使用 new Date(),并传入跟 Date.UTC() 相同的参数,它会自动调用 Date.UTC 解析,但是这时是以我们所在地区的时间作为参数解析的,也就不会有时差,就像下面这样:
var date = new Date(2005, 4, 5, 17, 55, 55)
date.toString() // "Thu May 05 2005 17:55:55 GMT+0800 (中国标准时间)"
三、获取时间
1. 有时区偏差
获得的时间是没有帮我们自动减掉后面的 GMT+0800 时区的时间,但是如果是通过下面的方式创建出来的 Date 实例的话,会有正正得正的效果,结果刚刚好满足我们的期望
var date = new Date(2005, 4, 5, 17, 55, 55)
date.toString() // "Thu May 05 2005 17:55:55 GMT+0800 (中国标准时间)"
方法 | 结果 |
---|---|
getTime() | 1115286955000 |
getFullYear() | 2005 |
getMonth() | 4 |
getDate() | 5 |
getDay() | 4 |
getHours() | 17 |
getMinutes() | 55 |
getSeconds() | 55 |
getMilliseconds() | 0 |
getTimezoneOffset() | -480 |
2. 没有时区偏差
获得的时间会自动帮我们减掉时区偏差,所以如果使用下面的方式来创建 Date 实例会有 负正得负的反效果,小时跟我们想的传入的参数不一样了
var date = new Date(2005, 4, 5, 17, 55, 55)
date.toString() // "Thu May 05 2005 17:55:55 GMT+0800 (中国标准时间)"
方法 | 结果 |
---|---|
getUTCFullYear() | 2005 |
getUTCMonth() | 4 |
getUTCDate() | 5 |
getUTCDay() | 4 |
getUTCHours() | 9 (17-8) |
getUTCMinutes() | 55 |
getUTCSeconds() | 55 |
getUTCMilliseconds() | 0 |
通过下面的方式创建 Date 实例则会满足我们的预期,会有负负得正的效果,小时又变成 17 了,跟我们传入的参数一致
var date = new Date(Date.UTC(2005, 4, 5, 17, 55, 55))
data.toString() // "Fri May 06 2005 01:55:55 GMT+0800 (中国标准时间)"
方法 | 结果 |
---|---|
getUTCFullYear() | 2005 |
getUTCMonth() | 4 |
getUTCDate() | 5 |
getUTCDay() | 4 |
getUTCHours() | 17 |
getUTCMinutes() | 55 |
getUTCSeconds() | 55 |
getUTCMilliseconds() | 0 |
四、修改时间
方法 | 说明 |
---|---|
setTime() | 以毫秒数设置日期,会改变整个日期 |
setFullYear() | 设置日期的年份,必须是4位数字 |
setUTCFullYear() | 设置UTC日期的年份,必须是4位数字 |
setMonth() | 设置日期的月份,必须>=0,超过 11 则增加年份 |
setUTCMonth() | 设置UTC日期的月份,必须>=0,超过 11 则增加年份 |
setDate() | 设置日期的天数,传入的值超过该月中应有的天数,则增加月份 |
setUTCDate() | 设置UTC日期的天数,传入的值超过该月中应有的天数,则增加月份 |
setHours() | 设置日期的小时,传入的值超过23,则增加月份中的天数 |
setUTCHours() | 设置UTC日期的小时,传入的值超过23,则增加月份中的天数 |
setMinutes() | 设置日期的分钟数,传入的值超过59,则增加小时数 |
setUTCMinutes() | 设置UTC日期的分钟数,传入的值超过59,则增加小时数 |
setSeconds() | 设置日期的秒数,传入的值超过59,则增加分钟数 |
setUTCSeconds() | 设置UTC日期的秒数,传入的值超过59,则增加分钟数 |
setMilliseconds() | 设置日期中的毫秒数 |
setUTCMilliseconds() | 设置UTC日期中的毫秒数 |