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日期中的毫秒数
posted @ 2018-04-04 11:09  另一个小菜头  阅读(316)  评论(0编辑  收藏  举报