zoukankan      html  css  js  c++  java
  • 深入 JavaScript 时间对象 Date

    程序中涉及到时间相关的概念,都比较繁琐且易出错。JavaScript中的浏览器内置的 Date 对象,相比较其他编程 简单易用;相关方法一目了然。

    1、Date 原型对象上的方法

    Object.getOwnPropertyNames(Date.prototype) //注意这些方法都是不可枚举的
    ["constructor", "toString", "toDateString", "toTimeString", "toISOString", "toUTCString", "toGMTString", "getDate", "setDate", "getDay", "getFullYear", "setFullYear", "getHours", "setHours", "getMilliseconds", "setMilliseconds", "getMinutes", "setMinutes", "getMonth", "setMonth", "getSeconds", "setSeconds", "getTime", "setTime", "getTimezoneOffset", "getUTCDate", "setUTCDate", "getUTCDay", "getUTCFullYear", "setUTCFullYear", "getUTCHours", "setUTCHours", "getUTCMilliseconds", "setUTCMilliseconds", "getUTCMinutes", "setUTCMinutes", "getUTCMonth", "setUTCMonth", "getUTCSeconds", "setUTCSeconds", "valueOf", "getYear", "setYear", "toJSON", "toLocaleString", "toLocaleDateString", "toLocaleTimeString"]

    调用 Date 对象的 getter 方法:

    function printDateTable() {
        let date = new Date();
        let tem = {};
        let dateMethodName = Object.getOwnPropertyNames(Date.prototype);
        let dateMethodGet = dateMethodName.filter(m => m.startsWith('to') || m.startsWith('get'));
        dateMethodGet.forEach(m => {
            let dateFormat = date[m].call(date);
            tem[m] = dateFormat;
        });
        console.table(tem);
        return tem;
    }

     实际上,了解上述的方法,已经满足大部分业务场景的需要了。值得注意,toString 方法与 toUTCString 方法返回的时间不同,这涉及到两个概念。

    2、时间标准与 Unix 时间戳

    GMT 时间 即格林威治标准时间;这个时间系统的概念在 1884 年确立。

    UTC 协调世界时;利用原子钟计算时间与日期的系统。目前所有的国际通讯系统,卫星、航空、GPS 等,全部采用 UTC 时间。

    Unix 时间戳;即自1970年1月1日(UTC)起经过的毫秒数。

    通常将 GMT 和 UTC 视作等同。但 UTC 更加科学更加精确。

    3、UTC 时间与本地时间

    UTC 时间是世界统一时间,世界上同一时刻的 UTC 时间都是相同的,但相同的时刻具体到不同的地区、国家、时间是不一样的,这就是本地时间。

    4、JavaScript Date 构造函数参数

    Date 构造函数接受四种类型的参数:

    a、无参数的构造方法返回的实例,表示的是实例化时刻的日期和时间;

    b、Unix 时间戳,返回的是表示 Unix 时间戳时刻的实例;

    c、时间戳字符串,不同的浏览器与不同格式的字符串会导致解析差异;

    d、多个表示日期时间格式的数字,如 new Date(2020, 5, 26, 18, 25);

    5、Date 构造函数会根据接受的参数类型,自动判断参数表示的是本地时间还是 UTC 时间;

    a、无参数构造方法格式是唯一的,

    返回的是表示现在时刻的对象,可以自由转换成本地时间和 UTC 时间,在东八区,所以会相差8小时。

    new Date()
    Mon Jun 01 2020 14:42:13 GMT+0800 (中国标准时间)

    b、Unix 时间戳会被解析成时间戳代表时刻的对象。

    let timeStamp = new Date().getTime();
    new Date(timeStamp);
    Mon Jun 01 2020 14:50:06 GMT+0800 (中国标准时间)

    c、时间戳字符串,字符串格式不同,解析的结果不同。

    该字符串应该能被 Date.parse() 正确方法识别(即符合 IETF-compliant RFC 2822 timestamps 或 version of ISO8601)。

    由于浏览器之间的差异与不一致性,强烈不推荐使用Date构造函数来解析日期字符串 (或使用与其等价的Date.parse)。对 RFC 2822 格式的日期仅有约定俗称的支持。 对 ISO 8601 格式的支持中,仅有日期的串 (例如 "1970-01-01") 会被处理为 UTC 而不是本地时间,与其他格式的串的处理不同。

    常用时间字符串解析结果:

    只有日期的格式:

    function printDateFormat() {
        let dateFormat = ['2020-06-01', '2020/06/01', '2020 06 01', '20200601'];
        let dateTem = {};
        dateFormat.forEach(item => {
            dateTem[item] = new Date(item).toString();
        })
        console.table(dateTem);
    }

     可以看到:

    没有分隔符分割的日期格式,无法被正确识别;
    短线分割的日期格式,被处理成了 UTC 时间;
    斜线、空格(其他符号分隔符)分割的日期,被处理成本地时间。

     日期时间格式:

    function printDateTimeFormat() {
        let dateFormat = [
        'Tue Jun 02 2020 15:54:24 GMT+0800',
        '2020-06-02T07:54:24.271Z', 
        'Tue, 02 Jun 2020 07:54:24 GMT',
        '2020/6/2 下午3:54:24'
      ];
        let dateTem = {};
        dateFormat.forEach(item => {
            dateTem[item] = new Date(item).toString();
        })
        console.table(dateTem);
    }

     可以看到:
    1、第一种格式被解析成本地时间;
    2、第二、三字符串格式被解析成UTC时间;
    3、本地格式无法被正确解析(不符合ISO8601格式);

    d:多个表示日期时间格式的数字会被解析成本地时间;

    new Date(2020,6,2,15,29,30)
    Thu Jul 02 2020 15:29:30 GMT+0800 (中国标准时间)

    只传日期数字,时间默认凌晨。(每个参数都有默认值,与主观一致)

    new Date(2020,6,2)
    Thu Jul 02 2020 00:00:00 GMT+0800 (中国标准时间)

    参考资料:

    GMT与UTC简介,https://www.cnblogs.com/tosee/p/5538007.html

    MDN Date,https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date

  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/engeng/p/12967576.html
Copyright © 2011-2022 走看看