zoukankan      html  css  js  c++  java
  • 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日期中的毫秒数
  • 相关阅读:
    字符串hash+回文树——hdu6599
    数位dp——牛客多校H
    线段树区间离散化——牛客多校E
    最小表示法——牛客多校第七场A
    后缀自动机求多串LCS——spojlcs2
    后缀自动机求LCS——spoj-LCS
    后缀自动机求字典序第k小的串——p3975
    后缀自动机模板——不同子串个数p2408
    同构图+思维构造——牛客多校第六场E
    封装,调用函数,以及参数化
  • 原文地址:https://www.cnblogs.com/CccZss/p/8716175.html
Copyright © 2011-2022 走看看